2015-03-05 3 views
0

Я выполняю несколько трудоемких вычислений и хочу показать заставку во время выполнения процесса. Я пробовал:PyQt: дождитесь появления окна

form = QSpashScreen() 
form.showMessage('Please wait ...') 
form.show() 
time_consuming_function() 
form.close() 

Но заставка не появляется. Как я могу сделать эту работу?

+0

Причина, по которой заставка не появляется, заключается в том, что протекторы блокируются функцией «time_consuming_function». И когда функция возвращает форму, закрывается, прежде чем когда-либо будет отображаться. Один из способов - попытаться переместить «time_consuming_function» в другой поток (я не уверен, что это сработает, поскольку оно связано с построением графика). – Michael

ответ

0

Вы должны указать один из родителей для QSplashScreen, в противном случае он будет отображать конструктор этого в родной Qt:

QSplashScreen::QSplashScreen (const QPixmap & pixmap = QPixmap(), Qt::WindowFlags f = 0) 
Construct a splash screen that will display the pixmap. 

There should be no need to set the widget flags, f, except perhaps Qt::WindowStaysOnTopHint. 

Если у вас нет родительского виджета для этого, вы можете назначить QDesktopWidget, как родительская

from PyQt4.QtGui import * 
import time 


def time_consuming_function(): 
    time.sleep(10) 


def main(): 
    app = QApplication(sys.argv) 
    form = QSplashScreen(QDesktopWidget().screen()) 
    form.showMessage('Please wait ...') 
    form.resize(1000, 1000) 
    form.move(0, 0) 
    form.show() 
    time_consuming_function() 
    form.close() 
    app.exec_() 


if __name__ == '__main__': 
    import sys 

    main() 

Кстати, вы не должны использовать «tiem_consuming_function» с одной и той же нити основной, это будет блокировать поток пользовательского интерфейса, сделать поток UI не в состоянии реагировать на ввод данных пользователем, выглядит как UI замерзает.

+0

Замечание «кстати» - это настоящая проблема. Это также причина, по которой я делаю экран заставки в первую очередь. Виджет никогда не отображается, так как функция time_consuming_function блокирует основной поток. «Time_consuming_function» включает в себя построение графика в холсте matplotlib, поэтому его не так просто перевести в другой поток. – Michael

+0

Вы можете попробовать код, он должен отображаться, но пользовательский интерфейс не отвечает, поскольку я помещаю его в поток пользовательского интерфейса , –

+0

В некоторых случаях это может показаться, но гарантии нет. Я пробовал это с помощью простого виджета, содержащего только ярлык. Виджет сам появился, но текст ярлыка так и не появился. – Michael

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