PySide QWidget立即更新

时间:2012-02-09 23:24:28

标签: python qt pyside

在我的应用程序中,我调用了一个外部模块,它生成一些线程,执行一些操作,然后返回一个值。我正在尝试让一个QMessageBox在之前显示,并在完成之后更新的QLabel,但我很难过。代码就像这样(从按钮上的QObject.connect调用):

def _process(self):
  self._message_box.show()

  for i in range(3):
     rv = external_module_function_with_threads() // blocking function call
     label = getattr(self, "label%d" % (i + 1))
     label.setText(rv)

当我单击按钮并调用该函数时,消息框仅在循环完成后显示。标签仅在循环完成后才更新。我尝试在循环中调用label.repaint(),但似乎所做的只是让消息框显示得更早(但没有文本)。

我知道我没有违反“主线程以外的GUI操作”规则(......对吗?),有没有办法强制更新?

1 个答案:

答案 0 :(得分:1)

对于您的留言框,请使用self._message_box.exec_()。从我对你的问题的理解,我认为这将做你想要的。

from PySide.QtCore import *
from PySide.QtGui  import *

import sys
import time


class Main(QWidget):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout = QVBoxLayout(self)

        button = QPushButton("Press me")
        self.label = QLabel("Run #")

        map(layout.addWidget, [button, self.label])
        button.pressed.connect(self.buttonPressed)

        self.messageBox = QMessageBox()

    def buttonPressed(self):
        self.messageBox.exec_()
        Thread().run(self.label)


class Thread(QThread):

    def run(self, label):
        for x in range(5):
            self.updateLabel(label)
            app.processEvents()
            time.sleep(.5)

    def updateLabel(self, label):
        try:
            number = int(label.text().split(" ")[-1])
            number += 1
        except ValueError:
            number = 0
        label.setText("Run %i" % number)


app = QApplication([])
main = Main()
main.show()
sys.exit(app.exec_())