2012-03-08 3 views
1

Я хочу, чтобы мой код запускался, показывая qtwidget, а затем запустил forloop, , но он запускает forloop, а затем показывает мой виджет для меня. Почему это?PyQt проблема времени выполнения

class tes(QWidget): 

    def __init__(self): 
     super(tes, self).__init__() 
     self.initUI() 
     for i in range (1000000): 
      print("s") 

    def initUI(self): 
     t = QTableWidget(8,8,self)   
     self.show() 
     self.resize(1000,1000) 
     t.setGeometry(0,0,500,500) 
     t.show() 

def main(): 
    app = QApplication(sys.argv) 
    t = tes() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 
+0

Это потому, что «показ» происходит в строке 'app.exec _()' (т. Е. При запуске mainloop). Я думаю, вам нужно уточнить, что вы пытаетесь сделать. – Avaris

ответ

0

Это потому, что вы запускаете app.exec_() после того, как цикл выполняется во время инициализации tes объекта.

6

Добавить QApplication.processEvents() перед циклом. Ваш виджет будет показан, но не отвечает. Чтобы сделать приложение чувствительным, добавьте processEvents() звонки на некоторые шаги вашего цикла.

Пример:

def __init__(self): 
    super(tes, self).__init__() 
    self.initUI() 
    QApplication.processEvents() 
    for i in range (1000000): 
     if not i % 3: # let application process events each 3 steps. 
      QApplication.processEvents() 
     print("s") 
+0

Да, я решил это так. cheers – K100

+1

Более конкретно, когда вы вызываете 'self.initUI()', генерируемые события (такие как showEvent) помещаются в очередь событий, но цикл событий еще не запущен. Когда вы вызываете 'processEvents()', вы вынуждаете его вручную выгружать очередь. – jdi

0

виджет отображается только после того, как приложение запущено, а не при его инициализации. Что именно вы пытаетесь сделать в цикле? Возможно, лучше подключить его к сигналу или обработать его в случае, но все зависит от того, что вы пытаетесь достичь.

Смежные вопросы