目的:
|
实现:
|
首先来实现第一个功能——在通知区域显示图标和对话气泡。
需要制作的是:图标,点击图标弹出的菜单,菜单的行为,对话气泡,主窗口。需要的模块是systray_rc,在PyQT的范例中可以找到,安装后的目录是\Python目录\Lib\site-packages\PyQt4\examples\desktop\systray,复制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下测试成功。