我有一个带有 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的,因此有以下选项:
将 Logo 复制到同一可执行文件夹中。
使用 --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() # ...
创建一个.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/