PyQt5应用程序图标相关

使用PyQt5进行软件界面布局时关于应用图标,托盘图标相关的设置;虽然开发时间不长,但是对使用情况做个记录

1、窗口图标

关于窗口图标的使用,pyqt5和大多数UI编程工具类似,在Qt Designer中的控件属性里可以设置

2、应用图标

应用图标则是指应用程序打包成.exe程序时,显示的图标,python下的打包工具常用的是PyInstaller。打包指令如下:

pyinstaller -F -w -i "./my_icon.ico" .\test.py

其中“my_icon.ico”即是要使用的打包应用所用的图标;

3、托盘图标

以上两种都是常用的,图标设置。关于托盘图标设置,若需要将程序隐藏到托盘运行,则必须设置;若图标未和程序一起打包到.exe中,将会使托盘功能失效。说到图标就要先说下托盘隐藏的实现,一下是我在网上根据大佬们的指导实现的一个简单托盘程序类。

class TrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, MainWindow, parent=None):
        super(TrayIcon, self).__init__(parent)
        self.ui = MainWindow
        self.createMenu()
        # self.singleton_checker = SingleInstanceChecker

    def createMenu(self):
        self.menu = QtWidgets.QMenu()
        self.showAction1 = QtWidgets.QAction("显示主界面", self, triggered=self.show_window)
        self.disableAction = QtWidgets.QAction("隐藏", self, triggered=self.disable_window)
        self.quitAction = QtWidgets.QAction("退出", self, triggered=self.quit)
        self.menu.addAction(self.showAction1)
        self.menu.addAction(self.disableAction)
        # self.menu.addAction(self.showAction2)
        self.menu.addAction(self.quitAction)
        self.setContextMenu(self.menu)
        # 设置图标
        self.setIcon(QtGui.QIcon("./favicon.ico"))
        self.icon = self.MessageIcon()
        # 把鼠标点击图标的信号和槽连接
        self.activated.connect(self.onIconClicked)

    def disable_window(self):
        self.ui.hide()

    def show_window(self):
        # 若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)
        self.ui.showNormal()
        self.ui.activateWindow()

    def quit(self):
        # print_in_log(log_file_path, "程序退出2!\n")
        QtWidgets.qApp.quit()

    # 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击
    def onIconClicked(self, reason):
        if reason == 2 or reason == 3:
            # self.showMessage("Message", "skr at here", self.icon)
            if self.ui.isMinimized() or not self.ui.isVisible():
                # 若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)
                self.ui.showNormal()
                self.ui.activateWindow()
                self.ui.setWindowFlags(QtCore.Qt.Window)
                self.ui.show()
            else:
                # 若不是最小化,则最小化
                self.ui.setWindowFlags(QtCore.Qt.SplashScreen)
                self.ui.showMinimized()
                self.ui.show()

使用该方法创建的托盘必须将图标图片根据引用的路径放到指定位置,否则会导致托盘图标功能找不到依托图片而失效。

而将图标和应用程序打包到一起也有很多办法,这里主要讲到两种;

a、使用PyInstaller的spec文件制定打包额外的文件

  1. .ico 文件添加到项目目录中将你的 favicon.ico 文件复制到你的项目文件夹中,确保它与你的 Python 脚本(.py 文件)位于同一目录下或者一个你可以轻松访问的子目录下。

  2. 在 PyInstaller 的 spec 文件中指定额外的文件你可以创建一个 PyInstaller 的 spec 文件(.spec),并在其中指定要包含在可执行文件中的额外文件,包括你的 .ico 文件

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

added_files = [
    ('favicon.ico', '.')  # 将 favicon.ico 添加到可执行文件中
]

a = Analysis(['your_script.py'],
             pathex=['path/to/your/script'],
             binaries=[],
             datas=added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='your_script',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False)

coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='your_script')

3.使用 spec 文件打包你的应用程序运行 PyInstaller 并指定你的 spec 文件:

pyinstaller myapp.spec

这种方法说是可以成功,我也忘记了我自己有没有成功,但觉得另一个方法也还不错。

b、使用pyrcc工具,将图标制作成.py文件https://blog.csdn.net/qq_42750240/article/details/131141491

首先,创建一个.qrc文件,该文件的作用是将资源文件(图标或者样式等)嵌入到Qt应用程序中。

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>favicon.ico</file>
</qresource>
</RCC>

其中favicon.ico就是你想嵌入的资源文件名,这里是图标。

接下来,在终端中使用pyrcc将上边制作的.qrc文件编译成python的一个模块就好。

pyrcc5 my_icons.qrc -o test_icons.py

“-o”和linux下使用gcc编译类似,用于指定输出文件名称,运行完成没报错的话,在应用程序路径下就能找到一个“test_icons.py”的文件,这个文件包含了再.qrc中定义的资源。

之后,就像导入普通模块一样,import一下就好,然后在那原有调用图标处将调用指令换成“:/favicon.ico”

...
import test_icons
...

self.setIcon(QtGui.QIcon(":/favicon.ico"))
self.icon = self.MessageIcon()

这样,在程序运行时,你就可以通过相应的资源路径来访问这个图标了,而不需要依赖外部文件。

上面就是一些使用PyQt5制作应用程序时,关于图标使用的相关记录,自己做个笔记,也希望对大家有帮助!共勉!!!

### 使用PyQt5创建应用程序的开发指南 #### PyQt5简介 PyQt5Python 对 Qt 框架的一个绑定库,能够帮助开发者快速构建跨平台的图形用户界面(GUI)应用程序。通过 PyQt5,不仅可以轻松实现复杂的交互逻辑,还支持多种高级特性,如信号与槽机制、国际化支持以及丰富的控件集[^3]。 --- #### 创建一个简单 PyQT 应用程序的核心步骤说明 为了使用 PyQt5 构建一个基础的应用程序,通常需要完成以下几个核心部分: 1. **导入必要的模块** 需要引入 `sys` 和 PyQt5相关类,这些类提供了 GUI 组件的功能。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout ``` 2. **初始化应用程序实例** 创建一个 `QApplication` 实例作为应用程序的基础对象,该对象管理事件循环和其他全局设置。 ```python app = QApplication(sys.argv) ``` 3. **定义主窗口及其布局** 使用 `QWidget` 类创建主窗口,并为其添加所需的 UI 控件和布局方式。 ```python window = QWidget() layout = QVBoxLayout() # 垂直布局 label = QLabel("欢迎来到 PyQt5!") button = QPushButton("点击我") layout.addWidget(label) layout.addWidget(button) window.setLayout(layout) window.setWindowTitle('我的第一个 PyQt5 应用') window.resize(300, 200) # 设置初始大小 ``` 4. **连接信号与槽函数** 定义按钮被点击后的行为,这可以通过将按钮的 `clicked` 信号连接到自定义方法来实现。 ```python def on_button_click(): label.setText("按钮已被点击!") button.clicked.connect(on_button_click) ``` 5. **启动应用程序并进入事件循环** 显示窗口并将控制权交给应用程序的主事件循环。 ```python window.show() sys.exit(app.exec_()) ``` 完整的示例代码如下所示: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout def on_button_click(): """当按钮被点击时触发""" label.setText("按钮已被点击!") app = QApplication(sys.argv) # 主窗口 window = QWidget() layout = QVBoxLayout() # 垂直布局 label = QLabel("欢迎来到 PyQt5!") # 文本标签 button = QPushButton("点击我") # 按钮 # 将控件加入布局 layout.addWidget(label) layout.addWidget(button) # 连接信号与槽 button.clicked.connect(on_button_click) # 设置布局 window.setLayout(layout) window.setWindowTitle('我的第一个 PyQt5 应用') # 窗口标题 window.resize(300, 200) # 初始尺寸 # 展示窗口并进入事件循环 window.show() sys.exit(app.exec_()) # 启动应用 ``` --- #### 关于嵌入式 ARM Linux 上运行 PyQt5 应用 如果目标是在嵌入式设备上部署 PyQt5 应用,则需要注意一些额外事项。例如,在 ARM 平台上安装依赖项可能涉及交叉编译或其他特殊配置过程。不过,得益于 Python 生态系统的灵活性,这种复杂度相对较低[^4]。 --- #### 打包 PyQt5 应用为独立可执行文件 为了让最终用户无需安装 Python 或其他依赖即可运行您的 PyQt5 应用,可以利用工具如 PyInstaller 来打包项目。下面展示了一个简单的打包脚本模板: ```python from PyInstaller.__main__ import run if __name__ == '__main__': opts = [ 'main.py', '--onefile', # 单一文件模式 '--windowed', # 不显示命令行窗口 (适用于 GUI 应用) '--add-data=path_to_resource_file;.', # 添加资源文件 '--name=MyApp', # 输出 EXE 文件名 '--icon=path_to_icon.ico' # 图标文件路径 ] run(opts) ``` 此脚本会调用 PyInstaller API 自动处理所有必要步骤,从而生成适合分发给用户的独立版本[^5]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值