栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【PyQt5设置窗口图标后任务栏图标一闪而过或不显示的踩坑记录】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【PyQt5设置窗口图标后任务栏图标一闪而过或不显示的踩坑记录】

PyQt5设置窗口图标后任务栏图标一闪而过或不显示的踩坑记录
  • win10-64bit系统,PyQt5 - 5.15.6版本,pycharm开发环境
    • 异常描述
    • 问题分析
    • 问题复现
    • 修复后的代码:
  • 总结

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()函数之后再设置窗口标题和图标等或者其他操作

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号