python - 当通过任务计划程序执行 Qt 应用程序时,如何加载 Qt 应用程序的托盘图标?

标签 python scheduled-tasks pyinstaller pyside trayicon

我有一个带有 qt 设计器 ui 的 python 应用程序,我使用 pyinstaller 将 .py 转换为 exe,手动执行时托盘图标可以工作,但是一旦我尝试使用任务计划程序运行它,应用程序就会运行,但我没有得到任何结果图标。 我附上了两张显示这两种情况的图片

手动运行时会发生什么

任务调度程序运行时会发生什么

我使用 pyinstaller --log-level DEBUG -F -d imports -w example.py 将 .py 转换为 .exe

更改为 .exe 之前的 samply.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys

from PySide.QtGui import QApplication, QMainWindow, QIcon, QMenu, QSystemTrayIcon

from test import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):

        super(MainWindow, self).__init__()
        self.setupUi(self)

        icon = QIcon("logo.png")
        menu = QMenu()
        menu = QMenu()
        hideAction = menu.addAction("Hide")
        hideAction.triggered.connect(self.hide)
        showAction = menu.addAction("Show")
        showAction.triggered.connect(self.show)
        self.setWindowIcon(QIcon("logo.png"))
        self.tray = QSystemTrayIcon()
        self.tray.setIcon(icon)
        self.tray.setContextMenu(menu)
        self.tray.setToolTip("Restart Scheduler!")
        self.show()


def main():

    app = QApplication(sys.argv)
    mainWin = MainWindow()
    ret = app.exec_()
    sys.exit(ret)


if __name__ == "__main__":
    main()

.ui 文件转换为 .py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created: Mon Feb 10 14:40:44 2020
#      by: pyside-uic 0.2.15 running on PySide 1.2.4
#
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(311, 317)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 311, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))

最佳答案

Logo 等资源的相对路径是相对于sample.py的,但是当它们转换为.exe时,它们是相对于.exe的,因此有以下选项:

  1. 将 Logo 复制到同一可执行文件夹中。

  2. 使用 --add-data 命令设置为“数据”:pyinstaller --log-level DEBUG -F -d imports --add-data="logo.png;."-wsample.py 并将sample.py修改为:

    # ...
    def resource_path(relative_path):
        """ Get absolute path to resource, works for dev and for PyInstaller """
        try:
            # PyInstaller creates a temp folder and stores path in _MEIPASS
            base_path = sys._MEIPASS
        except Exception:
            base_path = os.path.abspath(".")
    
        return os.path.join(base_path, relative_path)
    
    
    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):    
            super(MainWindow, self).__init__()
            self.setupUi(self)    
            icon = QIcon(resource_path("logo.png"))
    
            menu = QMenu(self)
            hideAction = menu.addAction("Hide")
            hideAction.triggered.connect(self.hide)
            showAction = menu.addAction("Show")
            showAction.triggered.connect(self.show)
            self.setWindowIcon(QIcon(resource_path("logo.png")))
            self.tray = QSystemTrayIcon()
            self.tray.setIcon(icon)
            self.tray.setContextMenu(menu)
            self.tray.setToolTip("Restart Scheduler!")
            self.show()
    # ...
    
  3. 创建一个.qrc,将其转换为.py并将其导入到sample.py中:

    资源.qrc

    <RCC>
        <qresource prefix="/">
            <file>logo.png</file>
        </qresource>
    </RCC>
    
    pyside-rcc resource.qrc -o resource_rc.py
    

    样本.py

    # ...
    import resource_rc
    # ...
    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):    
            super(MainWindow, self).__init__()
            self.setupUi(self)    
            icon = QIcon(":/logo.png")
    
            menu = QMenu(self)
            hideAction = menu.addAction("Hide")
            hideAction.triggered.connect(self.hide)
            showAction = menu.addAction("Show")
            showAction.triggered.connect(self.show)
            self.setWindowIcon(QIcon(":/logo.png"))
            self.tray = QSystemTrayIcon()
            self.tray.setIcon(icon)
            self.tray.setContextMenu(menu)
            self.tray.setToolTip("Restart Scheduler!")
            self.show()
    # ...
    

关于python - 当通过任务计划程序执行 Qt 应用程序时,如何加载 Qt 应用程序的托盘图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60156359/

相关文章:

python - 训练 CNN 时 GPU 使用率低

coldfusion - Cold Fusion cfschedule 的代码放在哪里?

python - Pyinstaller 的 ModuleNotFoundError

python - 使用 PyInstaller 仅将 Python 字符串转换为 float 失败

python - 在pygame中获取图像单个像素的颜色

python - 无法从 'Bootstrap5' 导入名称 'flask_bootstrap' ?

C++, Linux : error: conversion from ‘boost::unique_future<void>’ to non-scalar type ‘boost::shared_future<void>’ requested. 如何绕过它?

python-3.x - 带有pandas和numpy的Pyinstaller,exe在运行时抛出错误

python - 如何删除 tkinter GUI 中的所有元素?

java - 替代计划的任务,将来可能会取消