为什么QSplashscreen并不总是有效?

1 投票
1 回答
4379 浏览
提问于 2025-04-17 16:33

我刚刚在我的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()

撰写回答