2012-02-09 3 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 operations from the out the main thread» (... правильно?), Так есть способ заставить обновление?

ответ

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_()) 
Смежные вопросы