如果程序初始化加载时间较长,可以考虑增加启动画面使用户得到更好得使用体验,下面是两种增加启动画面的方法。
1、静态启动画面显示
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSplashScreen
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
import time # 用于模拟加载时间
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
class CustomSplashScreen(QSplashScreen):
def __init__(self, pixmap, flags=Qt.WindowStaysOnTopHint):
super().__init__(pixmap, flags)
def mousePressEvent(self, event):
# 重写鼠标点击事件处理函数,不执行任何操作
# 这样就可以防止点击启动画面时它被关闭
pass
# 应用程序入口点
if __name__ == "__main__":
app = QApplication(sys.argv)
# 创建并显示启动画面,使用适当的图片
splash_pix = QPixmap("./BB.png") # 替换为你的加载图片路径
splash = CustomSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
splash.setWindowOpacity(0.9) # 设置启动画面透明度
splash.show()
# 确保启动画面显示一段时间
start_time = time.time()
while time.time() - start_time < 3:
time.sleep(0.01)
app.processEvents() # 处理事件循环中的其他事件
# 初始化主窗口
window = MainWindow()
window.show()
# 关闭启动画面
splash.finish(window)
sys.exit(app.exec_())
2、动态启动画面显示
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSplashScreen, QLabel
from PyQt5.QtGui import QMovie, QFont
from PyQt5.QtCore import Qt, QTimer
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 执行耗时操作,比如加载数据,初始化设备等
self.load_resources()
def load_resources(self):
# 这里是加载资源的地方,可以通过在另一个线程中进行操作来避免阻塞GUI
pass
class CustomSplashScreen(QSplashScreen):
def __init__(self, movie):
super().__init__()
self.movie = movie
self.movie.frameChanged.connect(self.onNextFrame)
self.movie.start()
# 确保动画居中显示
self.lbl = QLabel(self)
self.lbl.setMovie(movie)
self.lbl.setAlignment(Qt.AlignCenter)
def onNextFrame(self):
# 将下一帧设置为 QSplashScreen 的 pixmap
pixmap = self.movie.currentPixmap()
self.setPixmap(pixmap)
self.resize(pixmap.size())
def mousePressEvent(self, event):
# 忽略点击事件
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
movie = QMovie("./z.gif") # 替换为您的GIF文件路径
splash = CustomSplashScreen(movie)
splash.setWindowOpacity(1.0)
splash.show()
# 初始化主窗口但不显示它
window = MainWindow()
# 使用定时器,在所有资源加载完成后显示主窗口和关闭启动画面
QTimer.singleShot(5000, splash.close) # 假设耗时操作需要5秒
QTimer.singleShot(5000, window.show)
sys.exit(app.exec_())