凌的博客

您现在的位置是: 首页 > 学无止境 > python > 

python

pyqt5 系统托盘(信息传递)

2019-10-08 python 2134

独立窗口托盘

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('./logo11.ico'))

    def quitApp(self):

        self.tp.setVisible(False)  # 隐藏托盘控件,托盘图标刷新不及时,提前隐藏
        qApp.quit()  # 退出程序
        sys.exit(0)
        # 退出程序
        # 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的连接

其他窗口托盘

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()  # 退出程序
        sys.exit(0)
        # 退出程序
        # 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.winState:
                self.w.sendInfo("hide")
            else:
                self.w.sendInfo("show")

    def run(self):

        a1 = QAction('&显示(Show)', triggered=lambda :self.w.sendInfo("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条评论