Python 当通过任务调度器执行Qt应用程序时,如何加载该应用程序的托盘图标?
我有一个带有qt designer ui的python应用程序,我使用pyinstaller将.py转换为exe,托盘图标在手动执行时工作,但是一旦我尝试使用任务调度器运行它,应用程序就会运行,但我没有得到任何图标。 我附上了两张显示这两种情况的图片 手动运行时会发生什么 由任务计划程序运行时会发生什么情况 我使用pyinstaller--log-leveldebug-F-d imports-w sample.py将.py转换为.exe samply.py,然后更改为.exePython 当通过任务调度器执行Qt应用程序时,如何加载该应用程序的托盘图标?,python,scheduled-tasks,pyinstaller,pyside,trayicon,Python,Scheduled Tasks,Pyinstaller,Pyside,Trayicon,我有一个带有qt designer ui的python应用程序,我使用pyinstaller将.py转换为exe,托盘图标在手动执行时工作,但是一旦我尝试使用任务调度器运行它,应用程序就会运行,但我没有得到任何图标。 我附上了两张显示这两种情况的图片 手动运行时会发生什么 由任务计划程序运行时会发生什么情况 我使用pyinstaller--log-leveldebug-F-d imports-w sample.py将.py转换为.exe samply.py,然后更改为.exe #/usr/b
#/usr/bin/python
#-*-编码:utf-8-*-
导入操作系统
导入系统
从PySide.QtGui导入QApplication、QMainWindow、QIcon、QMenu、QSystemTrayIcon
从测试导入Ui_主窗口
类主窗口(QMainWindow、Ui\u主窗口):
定义初始化(自):
超级(主窗口,自我)。\uuuu初始化
self.setupUi(self)
icon=QIcon(“logo.png”)
menu=QMenu()
menu=QMenu()
hideAction=menu.addAction(“隐藏”)
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(图标)
self.tray.setContextMenu(菜单)
self.tray.setToolTip(“重新启动计划程序!”)
self.show()
def main():
app=QApplication(sys.argv)
mainWin=MainWindow()
ret=app.exec
系统退出(ret)
如果名称=“\uuuuu main\uuuuuuuu”:
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))
资源(如徽标)的相对路径是相对于sample.py的,但当它们转换为.exe时,这些路径是相对于.exe的,因此有以下选项:
pyinstaller--log-level DEBUG-F-d imports--add data=“logo.png;”-w sample.py
并将sample.py修改为:
#。。。
def资源路径(相对路径):
“”“获取资源的绝对路径,适用于开发人员和PyInstaller”“”
尝试:
#PyInstaller创建临时文件夹并将路径存储在_MEIPASS中
基本路径=系统路径
除例外情况外:
基本路径=os.path.abspath(“.”)
返回os.path.join(基本路径、相对路径)
类主窗口(QMainWindow、Ui\u主窗口):
定义初始化(自):
超级(主窗口,自我)。\uuuu初始化
self.setupUi(self)
icon=QIcon(资源路径(“logo.png”))
菜单=QMenu(自身)
hideAction=menu.addAction(“隐藏”)
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(图标)
self.tray.setContextMenu(菜单)
self.tray.setToolTip(“重新启动计划程序!”)
self.show()
# ...
<RCC>
<qresource prefix="/">
<file>logo.png</file>
</qresource>
</RCC>
sample.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()
# ...
资源(如徽标)的相对路径是相对于sample.py的,但当它们转换为.exe时,这些路径是相对于.exe的,因此有以下选项:
pyinstaller--log-level DEBUG-F-d imports--add data=“logo.png;”-w sample.py
并将sample.py修改为:
#。。。
def资源路径(相对路径):
“”“获取资源的绝对路径,适用于开发人员和PyInstaller”“”
尝试:
#PyInstaller创建临时文件夹并将路径存储在_MEIPASS中
基本路径=系统路径
除例外情况外:
基本路径=os.path.abspath(“.”)
返回os.path.join(基本路径、相对路径)
类主窗口(QMainWindow、Ui\u主窗口):
定义初始化(自):
超级(主窗口,自我)。\uuuu初始化
self.setupUi(self)
icon=QIcon(资源路径(“logo.png”))
菜单=QMenu(自身)
hideAction=menu.addAction(“隐藏”)
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(图标)
self.tray.setContextMenu(菜单)
self.tray.setToolTip(“重新启动计划程序!”)
self.show()
# ...
<RCC>
<qresource prefix="/">
<file>logo.png</file>
</qresource>
</RCC>
sample.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()
# ...
@我添加了一个代码sample@eyllanesc我添加了一个代码示例。我确实将徽标和exe放在了dist文件夹中,当我手动运行它时,它可以正常工作,但没有一个是从任务中运行的scheduler@AltonGraham尝试第三种方法,通过硬编码徽标的路径,始终有效,或者在为调度程序执行操作时设置起始位置,最初它是在exe所在的路径中查找徽标图像,但任务调度程序不会从该位置执行default@AltonGraham这样你就不会有这样的问题了,我建议使用第三种方法,因为它不使用本地文件,而是将图标嵌入到可执行文件中。我确实将徽标与可执行文件一起放在dist文件夹中,当我手动运行它时,它可以正常工作,但它没有从任务中运行scheduler@AltonGraham尝试第三种方法,通过硬编码徽标的路径,始终有效,或者在为调度程序执行操作时设置起始位置,最初它是在exe所在的路径中查找徽标图像,但任务调度程序不会从该位置执行default@AltonGraham这样你就不会有这样的问题了,