46

我在 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 框架来完成这样的简单任务。

4

8 回答 8

19

这是我几年前使用 wxPython 编写的桌面通知程序——它在 Windows 和 Linux 上的行为相同,也应该在 OSX 上运行。它包含一个线程事件循环,可用于动画通知窗口,其中包含可以单击的图标和消息。它可能需要一些调整来为您自己的目的定制它,但基础工作已经完成。

于 2010-02-11T12:21:36.813 回答
17

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

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

  • 为了使通知易于跨平台移植,请不要让它们交互。例如,Ubuntu 不支持需要用户交互的通知。

  • 这些是最重要的库:

    o Linux:pynotify

    o Mac OS X:通常会安装 Growl,它不是标准的。

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

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

链接的 python 文件非常有趣,我认为您应该几乎可以按原样使用链接的 python 文件。代码也很清晰,所以你会很快看到它的作用。

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

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

于 2011-08-16T09:37:38.447 回答
7
  • 如何着手编写它

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

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

  • 对于 unix,您可能希望像已经提到的那样连接到 DBus(作为后备,请注意 dbus 也可能在 OSX 中可用),但是 KDE 和 Gnome 都有类似 Growl 的库。分别是 KDE 的 KNotification 和 Gnome 的 libnotify。

  • 对于 Windows,请查看 Snarl,如果不可用,则退回到通知气泡(使用类似于ToasterBox的东西)

永远不要考虑让通知变得粘滞。这是愚蠢的,它是麻木不仁的,它是令人讨厌的。此外,由于像您这样的人,它已在大多数通知系统中不可用。

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

于 2010-02-11T07:37:58.460 回答
3

如果您不关心大小,请尝试PyQt4 。

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

于 2010-02-12T04:28:41.280 回答
2

听起来你需要Growl for Windows

于 2010-07-13T18:44:36.087 回答
1

这是对我有用的简单方法。Toast 保持 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)
于 2014-02-09T14:38:11.717 回答
0

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

于 2010-02-11T04:24:30.560 回答
0

赢了你可以使用snarl

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

于 2010-02-11T06:30:52.237 回答