簡體   English   中英

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

[英]Cross-platform desktop notifier in Python

我在Python中尋找類似Growl的,類似於氣球提示的通知庫。 想象一下編寫如下代碼:

>>> 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框架來完成這樣的簡單任務。

這是我幾年前使用wxPython編寫的桌面通知程序 - 它在Windows和Linux上的行為相同,也應該在OSX上運行。 它包含一個線程事件循環,可用於為包含可單擊的圖標和消息的通知窗口設置動畫。 它可能需要進行一些調整才能為您自己的目的進行自定義,但是基礎工作已經完成。

在Pycon 2010上有一個關於跨平台Python開發演示文稿 還有一個關於它的html頁面,其中包含一些跨平台通知的建議。 但是,我不再在網上找到它,但我保存了一份本地副本,這是通知的一部分:

在某些情況下,您的應用程序想要通知用戶有關某些事情:軟件更新可用,已收到新的即時消息,300頁打印作業已完成,等等。

  • 要使通知易於跨平台移植,請不要使它們具有交互性。 例如,Ubuntu不支持需要用戶交互的通知。
  • 這些是最重要的圖書館:

    o Linux: pynotify

    o Mac OS X:通常會安裝非標准的Growl。

    O窗口:一個很好的wxPython的解決方案是ToasterBox安德烈Gavana,它模仿的Firefox或Thunderbird通知的樣子。

  • 對於Phatch,我們開發了一個庫,在一個API中統一這三個系統: phatch / lib / notify.py

鏈接的python文件非常有趣,我認為你應該能夠使用鏈接的python文件。 代碼也很清晰,所以你很快就會看到它的作用。

基本方法是檢測哪些通知系統可用,幾乎與平台無關,並嘗試按特定順序使用它們,但如有必要,可以回退到更簡單的系統。 這樣,如果用戶安裝了例如Growl,它將使用它,而不管平台如何。

您可以對其進行調整,以便為上述三種通知系統提供支持。

  • 怎么去寫它

    檢查keyring如何處理跨平台問題(它是一個python庫,可插入各種自動檢測的鑰匙串后端進行存儲)

  • Growl不與OSX捆綁在一起,你必須單獨安裝它,OSX沒有附帶任何內置的通知系統。

  • 對於unix,你可能想要像已經提到的那樣掛鈎到DBus(作為后備,注意dbus也可能在OSX中可用),但是KDE和Gnome都有類似Growl的庫。 KDE的KNotification和Gnome的libnotify。

  • 對於Windows,請查看Snarl,如果不可用,請回到通知氣泡(使用ToasterBox行的內容

永遠不要想到通知粘性。 這是愚蠢的,它不敏感,而且令人討厭。 此外,由於像你這樣的人,它在大多數通知系統中都不可用。

最后,即使沒有任何Python lib,你也可以使用ctypes來訪問它們。

試試PyQt4 ,如果你不在乎大小。

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

聽起來你需要Growl for 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創建的精簡文件'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 它會給你的圖書館增加一些重要性,但他們在解決大部分問題方面做得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM