Python Tech

PyQT实现通知区域图标和对话气泡

的:

  1. 软件运行时,在通知区域显示图标;
  2. 当有新任务时,显示对话气泡。
实现:

  1. 利用PyQT在系统的通知区域显示图标;
  2. 让Python程序循环执行。

首先来实现第一个功能——在通知区域显示图标和对话气泡。

需要制作的是:图标,点击图标弹出的菜单,菜单的行为,对话气泡,主窗口。需要的模块是systray_rc,在PyQT的范例中可以找到,安装后的目录是\Python目录\Lib\site-packages\PyQt4\examples\desktop\systray,复制systray_rc.pysystray_rc.pyc到开发目录下,新建一个tasktip.py,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import systray_rc
import threading

class Window(QtGui.QDialog):
    def __init__(self):
        super(Window, self).__init__()

        #设置一个iconComboBox
        self.iconComboBox = QtGui.QComboBox()
        self.iconComboBox.addItem(
            QtGui.QIcon('favicon.ico'), "Dmyz")
#-------------------通知区域图标右键菜单start------------------
        self.minimizeAction = QtGui.QAction(u"最小化", self,
                triggered=self.hide)
        self.restoreAction = QtGui.QAction(u"&显示窗口", self,
                triggered=self.showNormal)
        self.quitAction = QtGui.QAction(u"&退出", self,
                triggered=QtGui.qApp.quit)
        #弹出的菜单的行为,包括退出,还原,最小化
        self.trayIconMenu = QtGui.QMenu(self)
        self.trayIconMenu.addAction(self.restoreAction)
        self.trayIconMenu.addAction(self.minimizeAction)
        self.trayIconMenu.addAction(self.quitAction)
        self.trayIcon = QtGui.QSystemTrayIcon(self)
        self.trayIcon.setContextMenu(self.trayIconMenu)
#-------------------通知区域图标右键菜单end------------------
        #设置通知区域的ICON
        self.iconComboBox.currentIndexChanged.connect(
            self.setIcon)

        #通知区域icon显示
        self.iconComboBox.setCurrentIndex(1)
        self.trayIcon.show()
        self.trayIcon.activated.connect(
            self.iconActivated)

        #设定弹出主窗口的标题和大小
        self.setWindowTitle(u"动漫驿站通知程序")
        self.resize(400, 300)

    def iconActivated(self, reason):
        if reason in (QtGui.QSystemTrayIcon.Trigger,
                      QtGui.QSystemTrayIcon.DoubleClick):
            self.showNormal()
        elif reason == QtGui.QSystemTrayIcon.MiddleClick:
            self.showMessage()

    def setIcon(self, index):
        icon = self.iconComboBox.itemIcon(0)
        self.trayIcon.setIcon(icon)
        self.setWindowIcon(icon)
        self.trayIcon.setToolTip(
            self.iconComboBox.itemText(index))

    def showMessage(self):
        #这里是可以设置弹出对话气泡的icon的,作为实验就省略了
        icon = QtGui.QSystemTrayIcon.MessageIcon()
        self.trayIcon.showMessage(
            u'提示',u'您有新的任务,请注意查收', icon,1000)

    def getTasksNum(self):
        self.showMessage()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    QtGui.QApplication.setQuitOnLastWindowClosed(False)

    window = Window()
    window.getTasksNum()

    sys.exit(app.exec_())

然后来实现第二个功能——当有新任务时,显示对话气泡。

解决方案有很多,我选择了很没效率但是很简单的方式:Python每隔一段时间读取一次数据库或是某个文件,当这个文件或这个数据改变时,也就是插入了新任务,弹出对话气泡。在64行定义了名为getTasksNum的函数,用来弹出对话气泡,在这里设置为每隔30秒执行一次。

借助Python的多线程编程,可以很容易的实现这一功能。Python提供了几个用户多线程编程的模块,在这里使用threading,它比thread拥有更多的功能,提供多种同步机制。

Step1

#导入threading模块
import threading

Step2

#修改getTasksNum函数,可以加上条件判断
    def getTasksNum(self):
        if taskNum != 0:
            self.showMessage()

        global t
        t = threading.Timer(30.0, self.getTasksNum)
        t.start()

Step3

#在主程序中执行让getTasksNum循环执行
if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    QtGui.QApplication.setQuitOnLastWindowClosed(False)

    window = Window()
    t = threading.Timer(5.0, window.getTasksNum)
    t.start()

    sys.exit(app.exec_())

结束,这个时候主窗口还是空白的,根据需要自己写入内容。该程序在Gnome(本机是Ubuntu)窗口下无法弹出内容,会显示“没有可用的通知类型”,在虚拟机中的xp下测试成功。

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒