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

时间:2010-02-10 22:02:37

标签: python cross-platform desktop notifications growl

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

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

..并且会通过Mac,Windows和Linux上的相应工具提示进行通知。这样的图书馆存在吗?如果没有,我将如何自己写一个?

  • Mac是否附带默认通知程序? Growl是否应该单独安装?
  • 在Windows上,我认为这可能需要pywin32
  • 在Linux上,假设是GNOME,是否有一个GNOME API(使用gnome-python)可以做到这一点?
  • 我可以在所有平台上发出“粘性”通知(即,不要淡出)吗?

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

8 个答案:

答案 0 :(得分:19)

Here's a desktop notifier I wrote a few years ago using wxPython - 它在Windows和Linux上的行为相同,也应该在OSX上运行。它包含一个线程事件循环,可用于为包含可单击的图标和消息的通知窗口设置动画。可能需要进行一些调整才能为自己的目的进行自定义,但基础工作已经完成。

答案 1 :(得分:17)

在Pycon 2010上有一个presentation on cross-platform Python development。 还有一个关于它的html页面,其中包含一些跨平台通知的建议。但是,我不再在网上找到它,但我保存了一份本地副本,这是通知的一部分:

  

您的应用程序有时会想要通知用户   关于某事:软件更新可用,新的即时消息   已收到,300页打印作业终于完成等等。

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

         

    o Linux:pynotify

         

    o Mac OS X:通常是非常标准的低吼   安装。

         

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

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

  •   

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

基本方法是检测哪些通知系统可用,几乎与平台无关,并尝试按特定顺序使用它们,但如有必要,可以回退到更简单的系统。这样,如果用户具有例如无论平台如何,Growl安装它都会使用它。

您可以对其进行调整,以便为上述三种通知系统提供支持。

答案 2 :(得分:7)

  • 如何写它

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

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

  • 对于unix,你可能想要如前所述挂钩到DBus(作为后备,请注意dbus也可能在OSX中可用),但KDE和Gnome都有类似Growl的库。 KDE的KNotification和Gnome的libnotify。

  • 对于Windows,请查看Snarl,如果不可用则返回通知气泡(使用ToasterBox行的内容

永远不会甚至想到通知粘性。这是愚蠢的,它不敏感,而且令人讨厌。另外,由于像你这样的人在大多数通知系统中都可以使用而不是

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

答案 3 :(得分:3)

如果您不关心尺寸,请尝试PyQt4

这是这份工作的课程: http://doc.trolltech.com/4.5/qsystemtrayicon.html

答案 4 :(得分:2)

听起来你需要Growl for Windows

答案 5 :(得分:1)

这是一个对我有用的简单方法。吐司熬夜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创建的剪裁文件'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)

答案 6 :(得分:0)

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

答案 7 :(得分:0)

在胜利时,您可以使用snarl

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