如何解决从pythonpyside2中的Windows服务启动服务文件时,在Windows 10的通知栏中显示SystemTrayIcon无效
我有2个文件
- tray.py-包含用于在Windows的通知栏中显示SystemTray图标的代码
- Services.py-具有启动服务的代码,并调用tray.py
我为此使用pyside2,但是当我从Windows服务启动该服务时,它未在Windows的通知栏中显示SystemTray图标。我尝试使用MS DOS命令“ 开始/ B D:\ Pyside2 \ System-tray \ tray.py ”,即使这样也无法正常工作。我尝试通过在Python中使用 os.system()函数执行tray.py文件,但这也无法正常工作。请为此提供帮助,并先谢谢。
请找到以下随附的Service.py和tray.py文件代码,以及日志文件(在我调试时)
#Service.py
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import logging
import sys
import os
from PySide2 import QtWidgets,QtGui
from PySide2.QtWidgets import QApplication,QWidget,QPushButton,QHBoxLayout,QLabel,QLineEdit
from tray import SystemTrayIcon
# from Login import LoginWindow
import log
import subprocess
import threading
# from window import Window
logger = logging.getLogger(__name__)
class AppServerSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
def __init__(self,args):
log.setup_logging('D:\Pyside2\System-tray\Log\\','Service.log',True,True )
self.logger = logging.getLogger(__name__)
self.logger.debug("Init")
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.logger.debug("Init")
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
try:
self.logger.debug("Before Run")
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_,''))
self.logger.debug("In Run")
self.run = True
self.mainApp()
except Exception as e:
pass
# excepthook(*sys.exc_info())
def start(self):
self.logger.debug('In start')
self.mainApp()
'''
Override to add logic before the start
eg. running condition
'''
# pass
def stop(self):
self.run = False
'''
Override to add logic before the stop
eg. invalidating running condition
'''
pass
def restart(self):
self.SvcStop()
self.SvcDoRun()
def mainApp(self):
self.logger.debug("main started")
# w = QtWidgets.QWidget()
# tray_icon = SystemTrayIcon(QtGui.QIcon("D:\Pyside2\Images\icon_app_logo.png"),w)
# print(tray_icon)
try:
self.logger.debug('before trayicon1')
SystemTrayIcon.display()
self.logger.debug('trayicon1')
except Exception as e:
self.logger.debug(e)
self.logger.debug("last")
if __name__ == '__main__':
log.setup_logging('D:\Pyside2\System-tray\Log\\',True )
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(AppServerSvc)
# servicemanager.StartServiceCtrlDispatcher()
else:
logger.debug('In Else')
win32serviceutil.HandleCommandLine(AppServerSvc)
#tray.py
import os
import sys
from PySide2 import QtWidgets,QLineEdit
from backup_Info import Backup_Info
import log
import logging
import threading
# from Service import AppServerSvc
logger = logging.getLogger(__name__)
class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
"""
CREATE A SYSTEM TRAY ICON CLASS AND ADD MENU
"""
def __init__(self,icon,parent = None):
QtWidgets.QSystemTrayIcon.__init__(self,parent)
log.setup_logging('D:\Pyside2\System-tray\Log\\',True )
self.logger = logging.getLogger(__name__)
self.setToolTip('Hyper Data Protector Agent')
print("Tray icon")
self.logger.debug('In Tray Init')
menu = QtWidgets.QMenu(parent)
exit_ = menu.addAction("Exit")
exit_.triggered.connect(lambda: sys.exit())
exit_.setIcon(QtGui.QIcon("icon.png"))
self.logger.debug('In Tray triggered')
menu.addSeparator()
self.setContextMenu(menu)
self.activated.connect(self.onTrayIconActivated)
def onTrayIconActivated(self,reason):
if reason == self.DoubleClick:
self.logger.debug('In Tray Click')
print('Parent',self)
self.backup = QWidget()
self.win = Backup_Info(self.backup)
self.backup.show()
def display():
log.setup_logging('D:\Pyside2\System-tray\Log\\',True)
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
tray_icon = SystemTrayIcon(QtGui.QIcon("D:\Pyside2\Images\icon_app_logo.png"),w)
logger.debug('In Tray display %s',w)
tray_icon.show()
logger.debug("After show")
app.exec_()
def main():
log.setup_logging('D:\Pyside2\System-tray\Log\\',True)
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
tray_icon = SystemTrayIcon(QtGui.QIcon("D:\Pyside2\Images\icon_app_logo.png"),w)
logger.debug('In Tray Main')
print("Before show")
print(tray_icon)
tray_icon.show()
print("After show")
app.exec_()
if __name__ == '__main__' :
main()
我已将日志添加到上述文件中以进行调试。请找到以下相同的日志文件
[2020-08-13 00:40:39,825][MainThread][D][__main__][Service.py:<module>:93] : In Else
[2020-08-13 00:40:43,696][MainThread][D][__main__][Service.py:<module>:93] : In Else
[2020-08-13 00:40:47,758][MainThread][D][__main__][Service.py:<module>:93] : In Else
[2020-08-13 00:40:48,384][MainThread][D][Service][Service.py:__init__:27] : Init
[2020-08-13 00:40:48,385][MainThread][D][Service][Service.py:SvcDoRun:41] : Before Run
[2020-08-13 00:40:48,712][MainThread][D][Service][Service.py:SvcDoRun:43] : In Run
[2020-08-13 00:40:48,712][MainThread][D][Service][Service.py:mainApp:72] : main started
[2020-08-13 00:40:48,712][MainThread][D][Service][Service.py:mainApp:77] : before trayicon1
[2020-08-13 00:40:48,782][MainThread][D][tray][tray.py:__init__:74] : In Tray Init
[2020-08-13 00:40:48,785][MainThread][D][tray][tray.py:__init__:80] : In Tray triggered
[2020-08-13 00:40:48,786][MainThread][D][tray][tray.py:display:99] : In Tray display <PySide2.QtWidgets.QWidget(0x2bd6f30) at 0x0310E928>
[2020-08-13 00:40:48,787][MainThread][D][tray][tray.py:display:101] : After show
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。