2012-02-09 120 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_())