PyQT 在调用其他函数之前强制更新 textEdit
Posted
技术标签:
【中文标题】PyQT 在调用其他函数之前强制更新 textEdit【英文标题】:PyQT force update textEdit before calling other function 【发布时间】:2017-12-05 13:04:07 【问题描述】:我的问题涉及 PyQT5。 我尝试有一个带有按钮的对话框窗口,当点击时
-
更新
QTextEdit
字段的一些文本
调用函数(需要很长时间才能终止)
类似这样的:
class StartDialog(QtWidgets.QWidget, start_dialog_ui.Ui_Dialog):
def __init__(self, parent):
super(self.__class__, self).__init__()
self.setupUi(self)
self.OKButton.clicked.connect(self.start)
def start(self):
self.startDialogTextEdit.append("simulation running ...")
run_lengthy_function(self)
但是,当我运行我的 GUI 时,我注意到文本仅在 冗长函数终止之后更新,尽管在冗长函数之前调用了 QTextEdit.append
。如何强制提前更新文本?
到目前为止,我尝试的(但没有成功)是让 Python 在触发冗长的函数调用之前等待一段时间,即
from time import sleep
class StartDialog(QtWidgets.QWidget, start_dialog_ui.Ui_Dialog):
def __init__(self, parent):
super(self.__class__, self).__init__()
self.setupUi(self)
self.OKButton.clicked.connect(self.start)
def start(self):
self.startDialogTextEdit.append("simulation running ...")
sleep(5)
run_lengthy_function(self)
【问题讨论】:
【参考方案1】:重绘是在事件循环中调用的,所以整个线程休眠不会改变任何东西。
您可以通过以下方式手动调用重绘:
self.startDialogTextEdit.repaint()
或者调用静态方法:
QCoreApplication.processEvents()
内部也调用重绘
【讨论】:
非常感谢,self.startDialogTextEdit.repaint()
可以正常工作。【参考方案2】:
QTextEdit
中显示文字的解决方法是调用qApp.processEvents()
,这对GUI的更新强制:
def start(self):
self.startDialogTextEdit.append("simulation running ...")
QtWidgets.qApp.processEvents()
[...]
另一方面,如果任务很重,它可能会阻塞 GUI,所以也许一个解决方案是在另一个线程上运行它,我无法给出正确的建议,因为我不知道你的功能
【讨论】:
谢谢,QtWidgets.qApp.processEvents()
也适用于我。也感谢您使用另一个线程的提示。以上是关于PyQT 在调用其他函数之前强制更新 textEdit的主要内容,如果未能解决你的问题,请参考以下文章
如何在函数内部强制 COMMIT 以便其他会话可以看到更新的行?