Почему 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()