目的:
|
实现:
|
首先来实现第一个功能——在通知区域显示图标和对话气泡。
需要制作的是:图标,点击图标弹出的菜单,菜单的行为,对话气泡,主窗口。需要的模块是systray_rc,在PyQT的范例中可以找到,安装后的目录是Python目录Libsite-packagesPyQt4examplesdesktopsystray,复制systray_rc.py和systray_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下测试成功。
转载请注明:爱开源 » PyQT实现通知区域图标和对话气泡