凌的博客

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

python

PyQt5 系统托盘

2019-09-28 python 1734
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条评论