- win10-64bit系统,PyQt5 - 5.15.6版本,pycharm开发环境
- 异常描述
- 问题分析
- 问题复现
- 修复后的代码:
- 总结
先描述下遇到的问题:主程序desktop-main.py继承自QWidget,UiForm, QThread三个类,UiForm是自己写的ui类,在desktop-main.py主程序的__init__(self): 函数中初始化ui,每次主程序启动窗口工具栏图标都能正常显示,然而任务栏图标时有时无,有时一闪而过成空白,就连默认的图标都不显示。
问题分析百度了一下午尝试了无数博客的解决方案还是以失败而告终,只能自己慢慢琢磨,经过反复测试终于发现端倪,每次任务栏不显示图标的时候ui界面都会短暂的闪一次,闪的这一次能隐约看到是ui类的数据显示在了主窗口上,首先想到了可能是初始化主窗口时执行其他代码遇到阻塞导致任务栏图标显示失败,于是经过测试证实了我的猜测是正确的,以下为未修改之前有问题的代码:
class UiForm(object):
def setup_ui(self):
layout = QGridLayout()
layout.setSpacing(10)
class UserInterface(QWidget, UiForm, QThread):
def __init__(self):
super(UserInterface, self).__init__()
self.setWindowTitle("音乐解锁") # 设置主窗口标题
self.resize(1920, 980) # 设置主窗口大小
self.center() # 窗口居中显示
icon = QtGui.QIcon() # 初始化图标对象
icon.addPixmap(QtGui.QPixmap(":/music.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # 设置图标资源
self.setWindowIcon(icon) # 为窗口设置图标
self.setup_ui() # 初始化UI
if __name__ == '__main__':
app = QApplication(sys.argv)
main = UserInterface()
main.show()
sys.exit(app.exec_())
初始化主界面后在执行show()函数之前又初始化ui类,导致主界面短暂的阻塞
问题复现class UiForm(object):
def setup_ui(self):
layout = QGridLayout()
layout.setSpacing(10)
class UserInterface(QWidget, UiForm, QThread):
def __init__(self):
super(UserInterface, self).__init__()
self.setWindowTitle("音乐解锁") # 设置主窗口标题
self.resize(1920, 980) # 设置主窗口大小
self.center() # 窗口居中显示
time.sleep(0.5) # 模拟阻塞
icon = QtGui.QIcon() # 初始化图标对象
icon.addPixmap(QtGui.QPixmap(":/music.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # 设置图标资源
self.setWindowIcon(icon) # 为窗口设置图标
self.setup_ui() # 初始化UI
if __name__ == '__main__':
app = QApplication(sys.argv)
main = UserInterface()
main.show()
sys.exit(app.exec_())
短短0.5m的阻塞时间就能导致任务栏图标显示失败
class UiForm(object):
def setup_ui(self):
layout = QGridLayout()
layout.setSpacing(10)
class UserInterface(QWidget, UiForm, QThread):
def __init__(self):
super(UserInterface, self).__init__()
self.resize(1920, 980) # 设置主窗口大小
self.center() # 窗口居中显示
self.setup_ui() # 初始化UI
self.show() # 显示主窗口
time.sleep(5) # 模拟阻塞
self.setWindowTitle("音乐解锁") # 设置主窗口标题
icon = QtGui.QIcon() # 初始化图标对象
icon.addPixmap(QtGui.QPixmap(":/music.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # 设置图标资源
self.setWindowIcon(icon) # 为窗口设置图标
if __name__ == '__main__':
app = QApplication(sys.argv)
main = UserInterface()
# main.show()
sys.exit(app.exec_())
修复后阻塞5m任务栏能正常显示图标
在初始化主窗口调用show()函数之前尽量不要执行其他代码阻塞主窗口显示,建议在执行了show()函数之后再设置窗口标题和图标等或者其他操作



