2013-02-20 2 views
0

Я только что закодировал заставку в моем приложении PyQt, чтобы показать изображение перед запуском. Я использовал QSplashscreen. Проблема заключается в том, что изображение отображается, скажем, раз в 20 раз. В других случаях отображается серый прямоугольник istead. Скриншоты обоих случаев:Почему QSplashscreen не всегда работает?

ли работа: http://dl.getdropbox.com/u/1088961/prob2.jpg

Не работает: http://dl.getdropbox.com/u/1088961/prob1.jpg

Я попытался отложить начало окна, но если изменения серы прямоугольника в картину он как раз перед исчезающим (даже если я задержать все 10 секунд).

Это мой код:

# -*- coding: utf-8 -*- 
import sys 
from time import time, sleep 
from PyQt4.QtGui import QApplication, QSplashScreen, QPixmap 

from gui.gui import MainWindow 

def main(): 
    app = QApplication(sys.argv) 
    start = time() 
    splash = QSplashScreen(QPixmap("aquaticon/images/splash_screen.jpg")) 
    splash.show() 
    if time() - start < 1: 
     sleep(1) 
    win = MainWindow() 
    splash.finish(win) 
    win.show() 
    app.exec_() 

if __name__ == "__main__": 
    main() 

Я использую Debian Linux с Fluxbox (но это то же самое в Gnome).

ответ

3

Это из-за линии sleep(1). Для правильной работы QSplashScreen должен быть запущен цикл событий. Однако sleep блокирует. Таким образом, вы не добираетесь до app.exec_() (цикл событий) до sleep отделки (целую секунду). Этот «серый прямоугольник» - это тот случай, когда вы вводите sleep до того, как QSplashScreen может даже рисовать себя.

Для нормального случая у вас не будет этой проблемы, потому что вы будете ждать в Qt, и цикл событий будет запущен. Если вы хотите, чтобы «синтезированное» ожидание, сон для малых интервалов и заставить app делать свою работу с .processEvents():

# -*- coding: utf-8 -*- 
import sys 
from time import time, sleep 
from PyQt4.QtGui import QApplication, QSplashScreen, QPixmap 

from gui.gui import MainWindow 

def main(): 
    app = QApplication(sys.argv) 
    start = time() 
    splash = QSplashScreen(QPixmap("aquaticon/images/splash_screen.jpg")) 
    splash.show() 
    while time() - start < 1: 
     sleep(0.001) 
     app.processEvents() 
    win = MainWindow() 
    splash.finish(win) 
    win.show() 
    app.exec_() 

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

Спасибо, теперь все работает нормально :) – daniel90

+1

Обратите внимание, что QSplashScreen имеет довольно плохой баг что означает, что вы просто получаете серый прямоугольник, если у вас нет основного цикла: https://bugreports.qt-project.org/browse/QTBUG-24910 – xioxox

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