2012-02-09 122 views
1

在我的应用程序中,我调用了一个外部模块,它产生了一些线程,做了一些事情,然后返回一个值。我试图让QMessageBox在之前显示,在之后QLabel更新这是完成的,但我很难过。代码去(上的按钮从QObject.connect调用)是这样的:PySide QWidget立即更新

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

对于您的消息框使用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_())