PyQt5 系统托盘
2019-09-28 python 2355
import sys # 从PyQt库导入QtWidget通用窗口类,基本的窗口集在PyQt5.QtWidgets模块里. from PyQt5.QtWidgets import QApplication, QWidget, QSystemTrayIcon, QAction, QMenu, qApp, QMessageBox from PyQt5.QtGui import QIcon from PyQt5.QtCore import QCoreApplication if __name__ == '__main__': # pyqt窗口必须在QApplication方法中使用 # 每一个PyQt5应用都必须创建一个应用对象.sys.argv参数是来自命令行的参数列表.Python脚本可以从shell里运行.这是我们如何控制我们的脚本运行的一种方法. app = QApplication(sys.argv) # 关闭所有窗口,也不关闭应用程序 QApplication.setQuitOnLastWindowClosed(False) from PyQt5 import QtWidgets # QWidget窗口是PyQt5中所有用户界口对象的基本类.我们使用了QWidget默认的构造器.默认的构造器没有父类.一个没有父类的窗口被称为一个window. w = QWidget() # resize()方法调整了窗口的大小.被调整为250像素宽和250像素高. w.resize(250, 250) # move()方法移动了窗口到屏幕坐标x=300, y=300的位置. w.move(300, 300) # 在这里我们设置了窗口的标题.标题会被显示在标题栏上. w.setWindowTitle('Simple') # show()方法将窗口显示在屏幕上.一个窗口是先在内存中被创建,然后显示在屏幕上的. w.show() # from PyQt5.QtWidgets import QSystemTrayIcon # from PyQt5.QtGui import QIcon # 在系统托盘处显示图标 tp = QSystemTrayIcon(w) tp.setIcon(QIcon('./logo.png')) # 设置系统托盘图标的菜单 a1 = QAction('&显示(Show)', triggered=w.show) def quitApp(): w.show() # w.hide() #隐藏 re = QMessageBox.question(w, "提示", "退出系统", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if re == QMessageBox.Yes: # 关闭窗体程序 QCoreApplication.instance().quit() # 在应用程序全部关闭后,TrayIcon其实还不会自动消失, # 直到你的鼠标移动到上面去后,才会消失, # 这是个问题,(如同你terminate一些带TrayIcon的应用程序时出现的状况), # 这种问题的解决我是通过在程序退出前将其setVisible(False)来完成的。 tp.setVisible(False) a2 = QAction('&退出(Exit)', triggered=quitApp) # 直接退出可以用qApp.quit tpMenu = QMenu() tpMenu.addAction(a1) tpMenu.addAction(a2) tp.setContextMenu(tpMenu) # 不调用show不会显示系统托盘 tp.show() # 信息提示 # 参数1:标题 # 参数2:内容 # 参数3:图标(0没有图标 1信息图标 2警告图标 3错误图标),0还是有一个小图标 tp.showMessage('tp', 'tpContent', icon=0) def message(): print("弹出的信息被点击了") tp.messageClicked.connect(message) def act(reason): # 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击 if reason == 2 or reason == 3: w.show() # print("系统托盘的图标被点击了")
# 系统托盘图标 双击 显示 隐藏窗口
self.system_tray.show() # 显示系统托盘 self.system_tray.activated[QSystemTrayIcon.ActivationReason].connect(self.iconActivated) def iconActivated(self, reason): if reason == QSystemTrayIcon.DoubleClick: if self.isHidden(): self.show() else: self.hide()
附:在实际项目中的使用
def iconActivated(self,reason): if reason == QSystemTrayIcon.DoubleClick: if self.isHidden(): self.show() else: self.hide() def quit(self,tray): #self.hide() #隐藏 re = QMessageBox.question(self, "提示", "退出系统", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if re == QMessageBox.Yes: # 关闭窗体程序 QApplication.instance().quit() # 在应用程序全部关闭后,TrayIcon其实还不会自动消失, # 直到你的鼠标移动到上面去后,才会消失, # 这是个问题,(如同你terminate一些带TrayIcon的应用程序时出现的状况), # 这种问题的解决我是通过在程序退出前将其setVisible(False)来完成的。 tray.setVisible(False) def closeEvent(self, e): self.hide() e.ignore() if __name__ == "__main__": app = QApplication(sys.argv) # 关闭所有窗口,也不关闭应用程序 # QApplication.setQuitOnLastWindowClosed(False) action = Action() action.show() from PyQt5.QtWidgets import QSystemTrayIcon,QMenu,QAction tray = QSystemTrayIcon() tray.setIcon(QIcon("logo.png")) showAction = QAction('&显示(Show)', triggered=action.show) exitAction = QAction('&退出(Exit)', triggered= lambda : action.quit(tray)) # 添加菜单 tmenu = QMenu() tmenu.addAction(showAction) tmenu.addAction(exitAction) tray.setContextMenu(tmenu) tray.activated.connect(action.iconActivated) tray.show() sys.exit(app.exec_())
###############
使用类
import sys from PyQt5.QtWidgets import QSystemTrayIcon,qApp,QAction,QMenu#,QMessageBox from PyQt5.QtGui import QIcon class SystemTray(object): # 程序托盘类 def __init__(self, w,app): self.app = app self.w = w # QApplication.setQuitOnLastWindowClosed(False) # 禁止默认的closed方法,只能使用qapp.quit()的方法退出程序 self.w.show() # 不设置显示则为启动最小化到托盘 self.tp = QSystemTrayIcon(self.w) self.initUI() self.run() def initUI(self): # 设置托盘图标 self.tp.setIcon(QIcon('./logo_64.ico')) def quitApp(self): self.tp.setVisible(False) # 隐藏托盘控件,托盘图标刷新不及时,提前隐藏 qApp.quit() # 退出程序 # 退出程序 # self.w.show() # w.hide() #设置退出时是否显示主窗口 # re = QMessageBox.question(self.w, "提示", "退出系统", QMessageBox.Yes | # QMessageBox.No, QMessageBox.No) # if re == QMessageBox.Yes: # self.tp.setVisible(False) # 隐藏托盘控件,托盘图标刷新不及时,提前隐藏 # qApp.quit() # 退出程序 def message(self): # 提示信息被点击方法 print("弹出的信息被点击了") def act(self, reason): # 主界面显示方法 # 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击 #if reason == 2 or reason == 3: if reason == QSystemTrayIcon.DoubleClick: if self.w.isHidden(): self.w.show() else: self.w.hide() def run(self): a1 = QAction('&显示(Show)', triggered=self.w.show) a2 = QAction('&退出(Exit)', triggered=self.quitApp) tpMenu = QMenu() tpMenu.addAction(a1) tpMenu.addAction(a2) self.tp.setContextMenu(tpMenu) self.tp.show() # 不调用show不会显示系统托盘消息,图标隐藏无法调用 # 信息提示 # 参数1:标题 # 参数2:内容 # 参数3:图标(0没有图标 1信息图标 2警告图标 3错误图标),0还是有一个小图标 # self.tp.showMessage('Hello', '您使用了托盘', icon=0) # 绑定提醒信息点击事件 self.tp.messageClicked.connect(self.message) # 绑定托盘菜单点击事件 self.tp.activated.connect(self.act) sys.exit(self.app.exec_()) # 持续对app的连接
很赞哦! (0)
相关文章
文章评论
-
-
-
0条评论