Почему QSplashscreen не всегда работает?

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

Работает ли: 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 то же самое).

1 ответ

Решение

Это из-за 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()
Другие вопросы по тегам