有没有办法让 qtimer 等到函数完成?
Is there a way to make qtimer wait until a function is done?
我有一个应用程序,我想在其中执行以下操作:
- 优化一个问题
- 等待一定时间,例如一分钟
- 测量某个属性
- 重复第二步和第三步几次
- 从 1 重新开始。)
我想在单击 QPushButton 时开始整个过程。步骤 2.) 必须仅在步骤 1.) 完全终止时才开始。我不知道优化过程需要多长时间,因此我不能只使用 QTimer.sleep().
我已经通过以下方式解决了这个问题:
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QDialog
from PyQt5 import QtWidgets
import sys
class MyForm():
def __init__(self):
self.ui = QDialog()
self.button = QtWidgets.QPushButton(self.ui)
self.button.clicked.connect(self.start_timer)
self.waiting_interval = 10000
self.ui.show()
def start_timer(self):
self.optimize()
self.counter = 0
self.timer = QTimer()
self.timer.timeout.connect(self.tick)
self.timer.setSingleShot(True)
self.timer.start(self.waiting_interval)
def tick(self):
self.timer = QTimer()
if self.counter == 9:
self.timer.timeout.connect(self.start_timer)
else:
self.measure_property()
self.timer.timeout.connect(self.tick)
self.timer.setSingleShot(True)
self.timer.start(self.waiting_interval)
self.counter += 1
def optimize(self):
pass
def measure_property(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
w=MyForm()
app.exec_()
它产生了我想要的结果,但我正在寻找一种更聪明的方法来做到这一点,也许使用信号和槽。如有任何帮助,我们将不胜感激!
需要很长时间的任务很繁重,往往会冻结 GUI,给用户带来不好的体验,在这些情况下,这些任务必须在另一个线程中执行:
import sys
from PyQt5 import QtCore, QtWidgets
class ProcessThread(QtCore.QThread):
def run(self):
while True:
self.optimize()
for _ in range(3):
QtCore.QThread.sleep(60)
self.measure_property()
def optimize(self):
print("optimize")
def measure_property(self):
print("measure_property")
class MyForm():
def __init__(self):
self.ui = QtWidgets.QDialog()
self.thread = ProcessThread(self.ui)
self.button = QtWidgets.QPushButton("Press me")
self.button.clicked.connect(self.thread.start)
self.waiting_interval = 10000
lay = QtWidgets.QVBoxLayout(self.ui)
lay.addWidget(self.button)
self.ui.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w=MyForm()
sys.exit(app.exec_())
我有一个应用程序,我想在其中执行以下操作:
- 优化一个问题
- 等待一定时间,例如一分钟
- 测量某个属性
- 重复第二步和第三步几次
- 从 1 重新开始。)
我想在单击 QPushButton 时开始整个过程。步骤 2.) 必须仅在步骤 1.) 完全终止时才开始。我不知道优化过程需要多长时间,因此我不能只使用 QTimer.sleep().
我已经通过以下方式解决了这个问题:
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QDialog
from PyQt5 import QtWidgets
import sys
class MyForm():
def __init__(self):
self.ui = QDialog()
self.button = QtWidgets.QPushButton(self.ui)
self.button.clicked.connect(self.start_timer)
self.waiting_interval = 10000
self.ui.show()
def start_timer(self):
self.optimize()
self.counter = 0
self.timer = QTimer()
self.timer.timeout.connect(self.tick)
self.timer.setSingleShot(True)
self.timer.start(self.waiting_interval)
def tick(self):
self.timer = QTimer()
if self.counter == 9:
self.timer.timeout.connect(self.start_timer)
else:
self.measure_property()
self.timer.timeout.connect(self.tick)
self.timer.setSingleShot(True)
self.timer.start(self.waiting_interval)
self.counter += 1
def optimize(self):
pass
def measure_property(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
w=MyForm()
app.exec_()
它产生了我想要的结果,但我正在寻找一种更聪明的方法来做到这一点,也许使用信号和槽。如有任何帮助,我们将不胜感激!
需要很长时间的任务很繁重,往往会冻结 GUI,给用户带来不好的体验,在这些情况下,这些任务必须在另一个线程中执行:
import sys
from PyQt5 import QtCore, QtWidgets
class ProcessThread(QtCore.QThread):
def run(self):
while True:
self.optimize()
for _ in range(3):
QtCore.QThread.sleep(60)
self.measure_property()
def optimize(self):
print("optimize")
def measure_property(self):
print("measure_property")
class MyForm():
def __init__(self):
self.ui = QtWidgets.QDialog()
self.thread = ProcessThread(self.ui)
self.button = QtWidgets.QPushButton("Press me")
self.button.clicked.connect(self.thread.start)
self.waiting_interval = 10000
lay = QtWidgets.QVBoxLayout(self.ui)
lay.addWidget(self.button)
self.ui.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w=MyForm()
sys.exit(app.exec_())