PyQT强制在调用其他函数之前更新textEdit

时间:2017-12-05 13:04:08

标签: python pyqt pyqt5

我的问题与PyQT5有关。 我试着有一个带有按钮的对话窗口,点击后按下

  1. 更新QTextEdit字段
  2. 的部分文字
  3. 调用一个函数(需要很长时间才能终止)
  4. 这样的事情:

    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)
    

2 个答案:

答案 0 :(得分:2)

在事件循环中调用重绘,所以睡眠整个线程不会改变任何东西。

您可以通过以下方式手动调用重绘:

self.startDialogTextEdit.repaint()

或调用静态方法:

QCoreApplication.processEvents()

也在内部调用重绘

答案 1 :(得分:2)

QTextEdit中显示文本的案例的解决方案是调用qApp.processEvents(),此强制进行GUI更新:

def start(self):
    self.startDialogTextEdit.append("simulation running ...")
    QtWidgets.qApp.processEvents()
    [...]

另一方面,如果任务很重,可能会阻止GUI,所以也许一个解决方案是在另一个线程上运行它,我不能给出正确的建议,因为我不知道你的功能