当前位置: 首页 > article >正文

Qt for Python (PySide6)设置程序图标和任务栏图标

环境

使用Qt for Python开发Windows应用程序。
Python版本:3.12
Qt版本:PySide6

前言

先上一个简单的测试程序

from PySide6.QtWidgets import QMainWindow,QLabel,QApplication
from PySide6 import QtGui
import sys

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.resize(200,100)
        self.setWindowTitle("Hello World")
        label = QLabel("My test app.")
        label.setMargin(10)
        self.setCentralWidget(label)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    app.exec()

运行:
在这里插入图片描述

设置应用程序图标

以上测试程序,左上角没有程序图标,想要设置窗口显示的图标,很简单,和原生Qt开发一样的,添加setWindowIcon

修改以上代码,添加:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('logo.ico'))
    w = MainWindow()
    app.exec()

再次运行,就可以看到窗口显示的程序图标了。
在这里插入图片描述
通过pyinstaller打包出来:

 pyinstaller.exe .\TestIcon.py

这时候会看到一个默认的程序图标,如下:
在这里插入图片描述
这并不是我们想要设置的logo,想要修改这个应用程序图标,两个方法:

1.通过pyinstaller命令直接添加ico图标进行打包

pyinstaller.exe --windowed --icon=logo.ico .\TestIcon.py

然后可以看到同级目录下dist文件夹中,生成的打包程序:
在这里插入图片描述

2.通过修改.spec文件后打包

前面我们在执行 pyinstaller.exe .\TestIcon.py后 ,同级目录下会生成一个和Python文件名相同的.spec文件
在这里插入图片描述
通过文本打开后,在这里添加icon=['logo.ico'] 指定ico图标的位置
在这里插入图片描述
然后在终端使用pyinstaller执行这个spec文件:

pyinstaller.exe .\TestIcon.spec

也是同样的效果。

最后需要注意的是,pyinstaller打包后,需要将图标文件拷贝到运行程序目录去,否则运行时窗口图标显示不了。

设置任务栏图标

以上设置了窗口上显示的程序图标以及打包出来的exe显示的图标,再次运行这个程序,会发现系统任务栏上显示的图标依然不是我们设置的logo图标,而是这样:
在这里插入图片描述

这是因为运行应用程序时,Windows 会查看可执行文件并尝试猜测它属于哪个“应用程序组”。默认情况下,任何 Python 脚本(包括你的应用程序)都归入同一个“Python”组,因此将显示 Python 图标。为了阻止这种情况发生,我们需要为 Windows 提供不同的应用程序标识符。

下面的代码通过调用ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID()自定义应用程序 ID 来实现这一点。
只需要在代码前面添加以下内容:

try:
    from ctypes import windll  # Only exists on Windows.
    myappid = 'mycompany.myproduct.subproduct.version'
    windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
except ImportError:
    pass

完整代码如下:

from PySide6.QtWidgets import QMainWindow,QLabel,QApplication
from PySide6 import QtGui
import sys

try:
    from ctypes import windll  # Only exists on Windows.
    myappid = 'mycompany.myproduct.subproduct.version'
    windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
except ImportError:
    pass

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.resize(200,100)
        self.setWindowTitle("Hello World")
        label = QLabel("My test app.")
        label.setMargin(10)
        self.setCentralWidget(label)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('logo.ico'))
    w = MainWindow()
    app.exec()

再次运行,可以看到系统任务栏上已经能够正常显示logo了
在这里插入图片描述
注意:上面的列表显示了一个通用mycompany.myproduct.subproduct.version字符串,实际应该对其进行更改以成你的实际应用的信息。输入什么并不重要,但惯例是使用反向域表示法com.mycompany来表示公司标识符。


http://www.kler.cn/a/449557.html

相关文章:

  • Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)
  • SQL server学习09-数据库编程(上)
  • LeetCode 209. 长度最小的子数组 (C++实现)
  • 差分矩阵(Difference Matrix)与累计和矩阵(Running Sum Matrix)的概念与应用:中英双语
  • 车载网关性能 --- GW ECU报文(message)处理机制的技术解析
  • 基于蜂鸟视图的智慧可视化巡检管理系统研究
  • 【求职面试】大学转专业面试自我介绍模板7篇
  • 解决:websocket 1002 connection rejected 426upgrade required
  • 路径规划之启发式算法之二十:麻雀搜索算法(Sparrow Search Algorithm,SSA)
  • 搭建简易版本的git私有仓库--运用git和gitea
  • 灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常
  • 层序遍历练习
  • 重温设计模式--组合模式
  • 【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )
  • 终章:DevOps实践总结报告
  • 鸿蒙人脸识别
  • RISC-V架构的压缩指令集介绍
  • 【Quartz】任务调度
  • Qt C++ 下网络通信与文件发送的实现
  • 黑马商城项目—服务注册、服务发现
  • C++ STL CookBook
  • 拥有人类情感的AI:未来还是幻想?
  • 蓝桥杯刷题——day9
  • AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
  • K8S中的PV、PVC介绍和使用
  • 探秘 DNS 服务器:揭开域名解析的神秘面纱