Python中的跨平台桌面通知程序

我正在寻找类似Growl的,Windows中的气球提示类似的通知库。 想象一下编写代码如下:

>>> import desktopnotifier as dn >>> dn.notify('Title', 'Long description goes here') 

..这将通知相应的工具提示在Mac,Windows和Linux。 这样的图书馆是否存在? 如果不是的话,我怎样才能自己写一个呢?

  • Mac是否带有默认通知程序? 是咆哮的东西,我应该分开安装?
  • 在Windows上,我认为这可能需要pywin32 ?
  • 在Linux上,假设GNOME是否有GNOME API(使用gnome-python)呢?
  • 我可以在所有平台上使通知“粘性”(即不会消失)吗?

更新 :我的首选是依赖像PyQT4和wxPython这样的巨大的GUI框架来完成一个简单的任务。

这是几年前我用wxPython写的一个桌面通知器 – 它在Windows和Linux上的行为相同,也应该在OSX上运行。 它包含一个线程事件循环,可用于为包含图标和消息的通知窗口设置animation。 它可能需要一些调整来定制它为您自己的目的,但地面工作已经完成。

在Pycon 2010上,有关于跨平台Python开发的介绍 。 还有一个关于它的html页面,其中包含一些关于跨平台通知的build议。 但是,我不再在网上find它,但我保存了本地副本,这是通知的一部分:

在某些情况下,您的应用程序想要通知用户某些事情:软件更新可用,已收到新的即时消息,300页的打印作业最终完成等等。

  • 为了使通知易于跨平台移植,请不要让它们交互。 例如,Ubuntu不支持需要用户交互的通知。
  • 这些是最重要的图书馆:

    o Linux: pynotify 。

    o Mac OS X:通常不安装标准的Growl。

    o Windows:一个很好的wxPython解决scheme是Andrea Gavana的ToasterBox,它模仿Firefox或Thunderbird通知的外观。

  • 对于Phatch,我们开发了一个库,将这三个系统统一在一个API中: phatch / lib / notify.py 。

链接的python文件是非常有趣的,我想你应该可以使用链接的python文件。 代码也非常清晰,所以你会很快看到它的作用。

基本的方法是检测通知系统是否可用,几乎与平台无关,并尝试按照一定的顺序使用它们,但如果需要的话则回退到更简单的系统。 这样,如果用户安装了Growl,它将使用它,而不pipe平台。

除了上面提到的三个之外,您可以调整它来为其他通知系统提供支持。

  • 如何去写它

    检查keyring如何处理跨平台问题(这是一个python库插入到各种自动检测的钥匙串后端进行存储)

  • 咆哮不与OSX捆绑在一起,你必须单独安装它,OSX不附带任何内置的通知系统。

  • 对于unix,你可能想要像上面提到的那样挂钩到DBus(作为后备,请注意,dbus也可能在OSX中可用),但是KDE和Gnome都有类似Growl的库。 分别为KDE和GNOME的libnotify KNotification。

  • 对于窗户,检查出咆哮,回落到通知气泡,如果不可用(使用东西沿线ToasterBox )

甚至没有想到通知粘滞。 这是愚蠢的,它是不敏感的,而且很烦人。 另外,由于像你这样的人,大多数通知系统都无法使用。

最后,即使没有任何Python的lib,你也可以使用ctypes来访问它们。

尝试PyQt4 ,如果你不关心的大小。

这里是这个职位的类: http : //doc.trolltech.com/4.5/qsystemtrayicon.html

听起来像你需要Windows的咆哮

这里有一些简单的东西适合我。 吐司保持2秒钟并消失。 是的,OP不希望“巨大的”PyQt4,但这可能对其他人有用。

 import sys, time from PyQt4 import QtCore, QtGui import uiToast window = None # global # Usage: Toast('Message') class Toast(QtGui.QMainWindow): def __init__(self, msg): global window # some space outside the local stack window = self # save pointer till killed to avoid GC QtGui.QWidget.__init__(self) self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.ui = uiToast.Ui_MainWindow() self.ui.setupUi(self) self.ui.display.setText(msg) self.toastThread = ToastThread() # start thread to remove display self.connect(self.toastThread, QtCore.SIGNAL("finished()"), self.toastDone) self.toastThread.start() self.show() def toastDone(self): global window window = None # kill pointer to window object to close it and GC class ToastThread(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) def run(self): time.sleep(2.0) # wait and die 

由pyuic4创build的修剪文件“uiToast.py”是:

 from PyQt4 import QtCore, QtGui class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.resize(547, 96) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(255, 170, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) MainWindow.setPalette(palette) self.centralwidget = QtGui.QWidget(MainWindow) self.display = QtGui.QTextBrowser(self.centralwidget) self.display.setGeometry(QtCore.QRect(0, 0, 551, 101)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 170, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) self.display.setPalette(palette) font = QtGui.QFont() font.setPointSize(12) self.display.setFont(font) MainWindow.setCentralWidget(self.centralwidget) 

为了获得良好的跨平台支持,我会看看PyQt 。 它会给你的图书馆增加一些分量,但是他们在解决大部分问题方面做得很好。

在胜利,你可以使用咆哮 。

与python 一起使用它: http://www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972