为什么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 个回答
3
这是因为有一行代码是 sleep(1)
。为了让 QSplashScreen
正常工作,必须有一个事件循环在运行。但是,sleep
是一种阻塞操作,这意味着在 sleep
完成之前(整整一秒),你无法进入 app.exec_()
(事件循环)这一部分。这个“灰色矩形”就是在你调用 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()