Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当通过任务调度器执行Qt应用程序时,如何加载该应用程序的托盘图标?_Python_Scheduled Tasks_Pyinstaller_Pyside_Trayicon - Fatal编程技术网

Python 当通过任务调度器执行Qt应用程序时,如何加载该应用程序的托盘图标?

Python 当通过任务调度器执行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

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

手动运行时会发生什么

由任务计划程序运行时会发生什么情况

我使用pyinstaller--log-leveldebug-F-d imports-w sample.py将.py转换为.exe

samply.py,然后更改为.exe

#/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的,因此有以下选项:

  • 将徽标复制到同一可执行文件夹中

  • 使用--add data命令设置为“data”:
    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()
    # ...
    
  • 创建.qrc,将其转换为.py并导入sample.py:

    resource.qrc

    <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的,因此有以下选项:

  • 将徽标复制到同一可执行文件夹中

  • 使用--add data命令设置为“data”:
    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()
    # ...
    
  • 创建.qrc,将其转换为.py并导入sample.py:

    resource.qrc

    <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这样你就不会有这样的问题了,