PyQt GUI 操作顺序
PyQt GUI order of operations
我有以下问题:
在 PyQt 制作的 GUI 中按下按钮后,我必须执行两个操作:
- 立即更新一个QTextBrowser
- 运行 一个等待一段时间后启用一些按钮的方法。
我得到的是 1 和 2 在等待一段时间后同时完成。
部分代码为:
#in the signals definition...
signalUpdateProgressDialog = QtCore.pyqtSignal(str) # signal definition
#in the connections definition...
self.btnStopOpt.clicked.connect(self.clickStop1)
self.btnStopOpt.clicked.connect(self.clickStop)
def updateProgressDialog(self, dialog):
self.ProgressDialog.setHtml(dialog)
def clickStop1(self):
# notify
self.signalUpdateProgressDialog.emit('Message')
def clickStop(self):
# shut down thread...
print "Thread Stopped"
time.sleep(5)
# enable run button
self.btnRun.setEnabled(True)
我在一个 clickStop 方法中尝试了所有方法,我尝试了发出和不发出 updateProgress 信号。始终,仅在等待期后刷新 GUI。
然而,我以前遇到过这个问题,我想我不明白它是如何与 GUI 一起工作的。通常,如何获得所需的行为:执行代码行时更新 GUI?
在控制 return 到 Qt 事件循环之前,GUI 不会 updated/drawn。事件循环在主线程中运行,处理与 GUI 的交互并协调 signals/slot 系统。
当您在像 clickStop1()
这样的插槽中调用 Qt 函数时,Qt 调用会运行,但 GUI 不会立即重绘。在这种情况下,控制不会 return 到事件循环,直到 clickStop()
完成 运行(也就是处理 clicked
信号的所有槽。
您的代码的主要问题是您在主线程中有一个 time.sleep(5)
,它阻止了用户的 GUI 交互以及重绘。您应该保持插槽的执行时间短,以保持响应式 GUI。
因此我建议您修改 clicked()
以便它在您指定的超时后触发 singleshot QTimer
。 QTimer
s 不会阻塞主线程,因此会保持响应能力。但是,请注意用户可能同时与 GUI 交互!在您等待 QTimer
执行时,确保他们不会通过某些用户交互破坏您的程序状态。
我有以下问题:
在 PyQt 制作的 GUI 中按下按钮后,我必须执行两个操作:
- 立即更新一个QTextBrowser
- 运行 一个等待一段时间后启用一些按钮的方法。
我得到的是 1 和 2 在等待一段时间后同时完成。
部分代码为:
#in the signals definition...
signalUpdateProgressDialog = QtCore.pyqtSignal(str) # signal definition
#in the connections definition...
self.btnStopOpt.clicked.connect(self.clickStop1)
self.btnStopOpt.clicked.connect(self.clickStop)
def updateProgressDialog(self, dialog):
self.ProgressDialog.setHtml(dialog)
def clickStop1(self):
# notify
self.signalUpdateProgressDialog.emit('Message')
def clickStop(self):
# shut down thread...
print "Thread Stopped"
time.sleep(5)
# enable run button
self.btnRun.setEnabled(True)
我在一个 clickStop 方法中尝试了所有方法,我尝试了发出和不发出 updateProgress 信号。始终,仅在等待期后刷新 GUI。
然而,我以前遇到过这个问题,我想我不明白它是如何与 GUI 一起工作的。通常,如何获得所需的行为:执行代码行时更新 GUI?
在控制 return 到 Qt 事件循环之前,GUI 不会 updated/drawn。事件循环在主线程中运行,处理与 GUI 的交互并协调 signals/slot 系统。
当您在像 clickStop1()
这样的插槽中调用 Qt 函数时,Qt 调用会运行,但 GUI 不会立即重绘。在这种情况下,控制不会 return 到事件循环,直到 clickStop()
完成 运行(也就是处理 clicked
信号的所有槽。
您的代码的主要问题是您在主线程中有一个 time.sleep(5)
,它阻止了用户的 GUI 交互以及重绘。您应该保持插槽的执行时间短,以保持响应式 GUI。
因此我建议您修改 clicked()
以便它在您指定的超时后触发 singleshot QTimer
。 QTimer
s 不会阻塞主线程,因此会保持响应能力。但是,请注意用户可能同时与 GUI 交互!在您等待 QTimer
执行时,确保他们不会通过某些用户交互破坏您的程序状态。