2010-02-10 3 views
46

Je cherche Growl-like, bibliothèque de notifications en forme de bulle Windows en Python. Imaginez le code d'écriture comme:notificateur de bureau multiplate-forme en Python

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

.. et qui informerait avec des tooltips correspondants sur Mac, Windows et Linux. Est-ce qu'une telle bibliothèque existe? Sinon, comment pourrais-je en écrire un moi-même?

  • Le Mac est-il équipé d'un notificateur par défaut? Est-ce que Growl est quelque chose que je devrais installer séparément? Sur Windows, je suppose que cela peut nécessiter pywin32?
  • Sur Linux, en supposant GNOME, existe-t-il une API GNOME (utilisant gnome-python) qui le fait? Puis-je faire des notifications "collantes" (c'est-à-dire ne pas disparaître jamais) sur toutes les plates-formes?

Mise à jour: Ma préférence est de ne pas dépendent de cadres de GUI gigantesques comme pyqt4 et wxPython pour une tâche simple comme celle-ci.

+2

Notez que sur OSX, il y a un notificateur par défaut et maintenant Growl est devenu commercial (et donc la plupart du temps non standard). Voir [ici] (http://stackoverflow.com/questions/11814903/send-notification-to-mountain-lion-notification-center). Ou [ici] (https://github.com/albertz/music-player/blob/master/notifications.py) pour une implémentation Python. – Albert

Répondre

0

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

+0

PyQT est trop pour ma simple exigence. En outre, le déploiement des applications avec PyQT est une douleur * *: http://arstechnica.com/open-source/guides/2009/03/how-to-deploying-pyqt-applications-on-windows-and-mac-os- x.ars –

7
  • Comment s'y prendre écrire

    Vérifiez comment keyring gère les problèmes multi-plateforme (il est une bibliothèque de python qui se branche dans différents backends porte-clés détectés automatiquement pour stockage)

  • Growl n'est pas fourni avec OSX vous devez l'installer séparément, OSX ne possède pas de système de notification intégré. Pour les unix, vous voudrez peut-être vous connecter à DBus comme déjà mentionné (en tant que solution de secours, notez que dbus peut également être disponible sous OSX), mais KDE et Gnome ont des bibliothèques de type Growl. Respectivement, KNotification pour KDE et libnotify pour Gnome.

  • Pour les fenêtres, consultez Vrille, revenir à bulles notification si non disponible (en utilisant quelque chose le long des lignes de ToasterBox)

Est-ce jamais pensent même de faire des notifications gluant. C'est stupide, insensible et agaçant. En outre, en raison de personnes comme vous, il a été fait pas disponible dans la plupart des systèmes de notification.

Enfin, même s'il n'y a pas de librairie Python pour l'un de ceux-ci, vous pouvez probablement utiliser ctypes pour y accéder.

+0

c'est exactement comme ça que j'aborderais ceci s'il n'y a pas de module pour ça. upvoted pour la lecture de l'esprit. Maintenant, seulement quelqu'un doit le coder ... PS: j'utiliserais personnellement les bulles de Qt comme moyen de repli partout. Ils sont moche, mais chaque application graphique que j'écris utilise qt, donc c'est au moins toujours disponible. –

+2

"* OSX ne possède pas de système de notification intégré *" pas vrai pour les dernières versions d'OSX. –

19

Here's a desktop notifier I wrote a few years ago using wxPython - il se comporte de manière identique sur Windows et Linux et devrait également fonctionner sous OSX.Il contient une boucle d'événement threadée qui peut être utilisée pour animer une fenêtre de notification contenant une icône et un message sur lequel vous pouvez cliquer. Il a probablement besoin de quelques ajustements pour le personnaliser pour votre propre usage, mais le travail au sol est terminé.

+3

De quelle licence est-ce autorisé? Edit: Nevermind ... c'est un type de licence BSD ... merci d'avoir libéré le code en tant que tel. C'est une douleur de trouver des bibliothèques ou des choses que je veux apprendre de ne pas risquer de futures versions de mon code. Mais je n'ai aucun problème à donner crédit où le crédit est dû;) – ThantiK

+0

ce projet a migré vers https://github.com/stephenmcd/readertray – tc88

17

À PyCon 2010 il y avait un presentation on cross-platform Python development. Il y avait aussi une page html à ce sujet, contenant quelques conseils pour la notification multiplateforme. Cependant, je ne trouve pas plus en ligne, mais je sauvé une copie locale, ce qui est la partie sur les notifications:

There are occasions in which your application wants to notify the user about something: software updates are available, a new instant message have been received, the 300 page print job has finally finished, etc.

  • To keep notifications easy to port cross-platform, don't make them interactive. For example Ubuntu does not support notifications that require user interaction.
  • These are the most important libraries:

    o Linux: pynotify .

    o Mac OS X: Growl, which is not standard, is usually installed.

    o Windows: a good wxPython solution is ToasterBox of Andrea Gavana, which mimics the look of Firefox or Thunderbird notifications.

  • For Phatch we developed a library that unifies these three systems in one API: phatch/lib/notify.py .

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

L'approche de base est qu'il détecte sont disponibles quels sont les systèmes de notification, presque indépendamment de la plate-forme, et tente de les utiliser dans un certain ordre, mais retombe à des systèmes plus simples si nécessaire. De cette manière, si l'utilisateur a, par exemple, Growl installé, il va l'utiliser, indépendamment de la plate-forme.

Vous pouvez l'adapter à fournir un soutien à d'autres systèmes de notification que les trois mentionnés ci-dessus.

+1

Je ne sais pas pourquoi cette réponse n'a pas plus de votes upvotes. Cela a très bien fonctionné dès la sortie de la boîte, et c'est super facile à comprendre. –

+1

Essayé notify.py. Il doit être mis à jour avec 'import other.pyWx.toasterbox' →' importer wx.lib.agw.toasterbox comme TB', je crois. Mais ça ne marche toujours pas faire quoi que ce soit: 'envoyer (« titre », « message »)' '→ PyNoAppError: L'objet wx.App doit d'abord être créé!' – endolith

+0

Essentiellement, j'ai des applications sans fenêtre et je veux dire' ballon ('quelque chose') 'au lieu de' print ('quelque chose') '. Pourquoi devons-nous passer par tous les problèmes de créer et de détruire des fenêtres et des trucs juste pour faire apparaître des dialogues ou des ballons? http://stackoverflow.com/q/1635027/125507 – endolith

1

Voici quelque chose de simple qui fonctionne pour moi. Le toast reste relevé pendant 2 secondes et disparaît. Oui, OP ne voulait pas de PyQt4 «gigantesque», 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 dégrossi « 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) 
Questions connexes