it-swarm.com.de

Plattformübergreifender Desktop-Notifier in Python

Ich suche Growl - wie die Benachrichtigungsbibliothek von Windows-Sprechblasen in Python. Stellen Sie sich vor, Sie schreiben Code wie:

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

.. und das würde sich mit entsprechenden Tooltips unter Mac, Windows und Linux benachrichtigen. Gibt es eine solche Bibliothek? Wenn nicht, wie würde ich selbst eine schreiben?

  • Kommt Mac mit einem Standardbenachrichtiger? Ist Growl etwas, das ich separat installieren sollte?
  • Ich gehe davon aus, dass unter Windows pywin32 ?
  • Gibt es unter Linux unter GNOME eine GNOME-API (mit gnome-python), die dies tut?
  • Kann ich Benachrichtigungen auf allen Plattformen "sticky" machen (d. H. Niemals ausblenden)?

Update : Meine Einstellung ist nicht für gigantische GUI-Frameworks wie PyQT4 und wxPython für eine einfache Aufgabe wie diese.

45

Hier ist ein Desktop-Notifier, den ich vor einigen Jahren mit wxPython geschrieben habe - er verhält sich unter Windows und Linux identisch und sollte auch unter OSX laufen. Es enthält eine Thread-Ereignisschleife, mit der ein Benachrichtigungsfenster mit einem Symbol und einer Nachricht animiert werden kann, auf die geklickt werden kann. Möglicherweise sind einige Anpassungen erforderlich, um sie an Ihre eigenen Zwecke anzupassen, aber die Grundarbeit ist erledigt.

19

Auf der Pycon 2010 gab es eine Präsentation zur plattformübergreifenden Python-Entwicklung . Es gab auch eine HTML-Seite darüber, die Ratschläge für plattformübergreifende Benachrichtigungen enthielt. Ich finde es jedoch nicht mehr online, aber ich habe eine lokale Kopie gespeichert, und dies ist der Teil der Benachrichtigungen:

Es gibt Fälle, in denen Ihre Anwendung den Benutzer Über etwas informieren möchte: Softwareupdates sind verfügbar, eine neue Sofortnachricht Wurde empfangen, der 300-Seiten-Druckauftrag ist abgeschlossen, usw.

  • Damit Benachrichtigungen plattformübergreifend portiert werden können, sollten Sie sie nicht Interaktiv machen. Zum Beispiel unterstützt Ubuntu keine Benachrichtigungen , Die eine Benutzerinteraktion erfordern.
  • Dies sind die wichtigsten Bibliotheken:

    o Linux: pynotify .

    o Mac OS X: Growl, das kein Standard ist, wird normalerweise installiert.

    o Windows: Eine gute wxPython-Lösung ist ToasterBox von Andrea Gavana, die das Aussehen von Firefox- oder Thunderbird-Benachrichtigungen nachahmt.

  • Für Phatch haben wir eine Bibliothek entwickelt, die diese drei Systeme in einer API vereint: phatch/lib/notify.py .

Die verknüpfte Python-Datei ist sehr interessant und ich denke, Sie sollten die verknüpfte Python-Datei fast so verwenden können, wie sie ist. Der Code ist auch sehr klar, so dass Sie schnell sehen, was er tut.

Der grundlegende Ansatz besteht darin, die verfügbaren Benachrichtigungssysteme nahezu unabhängig von der Plattform zu erkennen und sie in einer bestimmten Reihenfolge zu verwenden, greift jedoch bei Bedarf auf einfachere Systeme zurück. Auf diese Weise kann der Benutzer, wenn er z. Growl installiert wird es unabhängig von der Plattform verwenden.

Sie können es anpassen, um andere Benachrichtigungssysteme als die drei zuvor genannten zu unterstützen.

17
Rabarberski
  • Wie schreibe ich es?

    Prüfen Sie, wie keyring die plattformübergreifenden Probleme handhabt (es ist eine Python-Bibliothek, die zur Speicherung in verschiedene automatisch erkannte Schlüsselketten-Backends gesteckt wird).

  • Growl ist nicht im Lieferumfang von OSX enthalten, sondern muss separat installiert werden. OSX verfügt über kein integriertes Benachrichtigungssystem.

  • Für Unixe sollten Sie, wie bereits erwähnt, in DBus einhaken (als Fallback beachten Sie, dass dbus möglicherweise auch in OSX verfügbar ist), aber sowohl KDE als auch Gnome verfügen über Growl-ähnliche Bibliotheken. KNotification für KDE und libnotify für Gnome.

  • Schauen Sie sich unter Windows Snarl an und greifen Sie auf Benachrichtigungsblasen zurück, wenn diese nicht verfügbar sind (verwenden Sie dazu etwas wie ToasterBox

Denke nicht immerdenke sogar daran, Benachrichtigungen klebrig zu machen. Es ist dumm, unempfindlich und nervig. Es ist auch ärgerlich. Aufgrund von Menschen wie dir wurde es nichtin den meisten Benachrichtigungssystemen verfügbar gemacht).

Selbst wenn keine Python-Bibliothek für diese vorhanden ist, können Sie wahrscheinlich ctypes verwenden, um darauf zuzugreifen.

7
masklinn

try PyQt4 , wenn Sie sich nicht für die Größe interessieren.

hier ist die Klasse für diesen Job: http://doc.trolltech.com/4.5/qsystemtrayicon.html

3
linjunhalida

Klingt wie du brauchst Growl für Windows

2

Hier ist etwas einfaches, das für mich funktioniert. Der Toast bleibt 2 Sekunden lang auf und verschwindet. Ja, OP wollte kein "gigantisches" PyQt4, aber das kann für andere nützlich sein.

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

Die heruntergeladene Datei 'uiToast.py', die von pyuic4 erstellt wurde, lautet:

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)
1
SoloPilot

Auf win können Sie snarl verwenden.

Verwendung mit Python: www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972

0
Dim

Für eine gute plattformübergreifende Unterstützung würde ich nach PyQt suchen. Es wird etwas mehr Gewicht in Ihre Bibliothek bringen, aber sie haben ihre Arbeit gut erledigt und die meisten Knicke geklärt.

0
tghw