[英]Cross-platform desktop notifier in Python
我在Python中尋找類似Growl的,類似於氣球提示的通知庫。 想象一下編寫如下代碼:
>>> import desktopnotifier as dn
>>> dn.notify('Title', 'Long description goes here')
..並且會通過Mac,Windows和Linux上的相應工具提示進行通知。 這樣的圖書館存在嗎? 如果沒有,我將如何自己寫一個?
更新 :我的偏好是不依賴於像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 。 它會給你的圖書館增加一些重要性,但他們在解決大部分問題方面做得很好。
贏了,你可以使用咆哮 。
與python 一起使用: www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.