web-dev-qa-db-fra.com

Notificateur de bureau multiplateforme en Python

Je cherche Growl - like, bibliothèque de notifications Windows en forme de bulle, en python. Imaginez écrire du code comme:

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

.. et que vous notifieriez avec les info-bulles correspondantes sur Mac, Windows et Linux. Une telle bibliothèque existe-t-elle? Sinon, comment pourrais-je en écrire un moi-même?

  • Est-ce que Mac est livré avec un notificateur par défaut? Est-ce que Growl est quelque chose que je devrais installer séparément?
  • Sous Windows, je suppose que cela peut nécessiter pywin32 ?
  • Sous Linux, en supposant que GNOME, existe-t-il une API GNOME (utilisant gnome-python) qui fait cela?
  • Puis-je rendre les notifications «collantes» (c'est-à-dire ne jamais disparaître) sur toutes les plateformes?

Update: Ma préférence va de not dépend de gigantesques frameworks d'interface graphique tels que PyQT4 et wxPython pour une tâche aussi simple que celle-ci.

45
Sridhar Ratnakumar

Voici un avis de bureau que j'ai écrit il y a quelques années à l'aide de wxPython - il se comporte de manière identique sous Windows et Linux et devrait également fonctionner sous OSX. Il contient une boucle d'évènements threadée qui peut être utilisée pour animer une fenêtre de notification contenant une icône et un message sur lequel l'utilisateur peut cliquer. Il a probablement besoin de quelques ajustements pour l'adapter à vos propres besoins, mais le travail de base est terminé.

19
Stephen McDonald

À Pycon 2010, il y avait une présentation sur le développement Python multiplate-forme . Il y avait aussi une page html à ce sujet, contenant quelques conseils pour la notification multiplate-forme. Cependant, je ne le trouve plus en ligne, mais j’ai sauvegardé une copie locale. C’est la partie sur les notifications:

Il existe des cas dans lesquels votre application souhaite notifier l'utilisateur à propos de quelque chose: des mises à jour logicielles sont disponibles, un nouveau message instantané ont été reçus, le travail d'impression de 300 pages est enfin terminé, etc.

  • Pour que les notifications restent faciles à porter sur plusieurs plates-formes, ne créez pas les interactifs. Par exemple, Ubuntu ne prend pas en charge les notifications qui nécessitent une interaction de l'utilisateur.
  • Ce sont les bibliothèques les plus importantes:

    o Linux: pynotify .

    o Mac OS X: Growl, qui n'est pas standard, est généralement installée.

    o Windows: une bonne solution wxPython est ToasterBox de Andrea Gavana, qui imite l'apparence des notifications Firefox ou Thunderbird.

  • Pour Phatch, nous avons développé une bibliothèque qui unit ces trois systèmes dans une API: phatch/lib/notify.py .

Le fichier python lié est très intéressant et je pense que vous devriez pouvoir utiliser le fichier python lié presque tel quel. Le code est également très clair, vous verrez donc rapidement ce qu’il fait.

L'approche de base est de détecter les systèmes de notification disponibles, presque indépendamment de la plate-forme, et d'essayer de les utiliser dans un certain ordre, mais de recourir à des systèmes plus simples, si nécessaire. De cette façon, si l’utilisateur a, par exemple, Growl installé il va l'utiliser, quelle que soit la plate-forme.

Vous pouvez l'adapter pour prendre en charge d'autres systèmes de notification que les trois mentionnés ci-dessus.

17
Rabarberski

essayez PyQt4 , si vous ne vous souciez pas de la taille.

voici la classe correspondant à ce travail: http://doc.trolltech.com/4.5/qsystemtrayicon.html

3
linjunhalida

On dirait que vous avez besoin Growl pour Windows

2
Cristian Lupascu

Voici quelque chose de simple qui fonctionne pour moi. Le Toast reste en place pendant 2 secondes et disparaît. Oui, OP ne voulait pas de «gigantesques» PyQt4, mais cela pourrait être utile aux autres.

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

Le fichier compressé 'uiToast.py' créé par pyuic4 est:

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

Sur Win, vous pouvez utiliser snarl .

Utilisation avec python: www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972

0
Dim

Pour un bon support multi-plateforme, je regarderais PyQt . Cela ajoutera du poids à votre bibliothèque, mais ils ont fait du bon travail pour résoudre la plupart des problèmes.

0
tghw