Notificador de escritorio multiplataforma en Python
cross-platform desktop (8)
Aquí hay algo simple que funciona para mí. La tostada se mantiene alta durante 2 segundos y desaparece. Sí, OP no quería PyQt4 ''gigantesco'', pero esto puede ser útil para otros.
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
El archivo recortado ''uiToast.py'' creado por pyuic4 es:
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)
Estoy buscando la biblioteca de notificaciones parecida a la de un globo de Windows, tipo Growl , en Python. Imagina escribir código como:
>>> import desktopnotifier as dn
>>> dn.notify(''Title'', ''Long description goes here'')
.. y que notificaría con la información sobre herramientas correspondiente en Mac, Windows y Linux. ¿Existe tal biblioteca? Si no, ¿cómo podría escribir uno yo mismo?
- ¿Mac viene con un notificador predeterminado? ¿ Growl es algo que debería instalar por separado?
- En Windows, supongo que esto puede requerir pywin32 ?
- En Linux, asumiendo GNOME, ¿existe una API de GNOME (usando gnome-python) que hace esto?
- ¿Puedo hacer notificaciones ''adhesivas'' (es decir, no desaparecer nunca) en todas las plataformas?
Actualización : Mi preferencia es no depender de gigantescos marcos de GUI como PyQT4 y wxPython para una tarea simple como esta.
En Pycon 2010 hubo una presentación sobre el desarrollo multiplataforma de Python . También había una página html que contenía algunos consejos para la notificación multiplataforma. Sin embargo, ya no lo encuentro en línea, pero guardé una copia local, y esta es la parte de las notificaciones:
Hay ocasiones en que su aplicación desea notificar al usuario sobre algo: hay actualizaciones de software disponibles, se ha recibido un nuevo mensaje instantáneo, el trabajo de impresión de 300 páginas finalmente ha finalizado, etc.
- Para que las notificaciones sean fáciles de cruzar multiplataforma, no las haga interactivas. Por ejemplo, Ubuntu no admite notificaciones que requieren la interacción del usuario.
Estas son las bibliotecas más importantes:
o Linux: pynotify .
o Mac OS X: Growl, que no es estándar, generalmente está instalado.
o Windows: una buena solución de wxPython es ToasterBox de Andrea Gavana, que imita el aspecto de las notificaciones de Firefox o Thunderbird.
Para Phatch desarrollamos una biblioteca que unifica estos tres sistemas en una API: phatch / lib / notify.py .
El archivo python vinculado es muy interesante, y creo que debería poder usar el archivo python vinculado casi como está. El código también es muy claro, por lo que rápidamente verá lo que hace.
El enfoque básico es que detecta qué sistemas de notificación están disponibles, casi sin importar la plataforma, y trata de usarlos en cierto orden, pero recurre a sistemas más simples si es necesario. De esta forma, si el usuario tiene, por ejemplo, Growl instalado, lo usará, independientemente de la plataforma.
Puede adaptarlo para proporcionar soporte para otros sistemas de notificación que los tres mencionados anteriormente.
En ganar puedes usar snarl .
Utilizándolo con python: www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972
Para un buen soporte multiplataforma, miraría a PyQt . Se agregará algo de peso a su biblioteca, pero han hecho un buen trabajo resolviendo la mayoría de los problemas.
Parece que necesitas Growl para Windows
prueba PyQt4 , si no te importa el tamaño.
aquí está la clase para este trabajo: http://doc.trolltech.com/4.5/qsystemtrayicon.html
Aquí hay un notificador de escritorio que escribí hace unos años usando wxPython : se comporta de manera idéntica en Windows y Linux, y también debe ejecutarse en OSX. Contiene un bucle de eventos enhebrado que se puede utilizar para animar una ventana de notificación que contiene un icono y un mensaje en el que se puede hacer clic. Probablemente necesite un par de ajustes para personalizarlo para su propio propósito, pero el trabajo de campo ya está hecho.
Cómo escribirlo
Comprueba cómo maneja el conjunto de
keyring
los problemas multiplataforma (es una biblioteca de Python que se conecta a varios backends de llavero autodetectados para su almacenamiento)Growl no está incluido con OSX, tiene que instalarlo por separado, OSX no viene con ningún sistema de notificación incorporado.
Para unixes, es posible que desee enganchar en DBus como ya se mencionó (como una alternativa, tenga en cuenta que dbus también podría estar disponible en OSX), pero tanto KDE como Gnome tienen bibliotecas tipo Growl. Respectivamente, KNotification para KDE y libnotify para Gnome.
Para Windows, echa un vistazo a Snarl, vuelve a las burbujas de notificación si no está disponible (usando algo ToasterBox )
Ni siquiera pienses en hacer las notificaciones pegajosas. Es estúpido, es insensible y es malditamente molesto. Además, debido a personas como usted, no está disponible en la mayoría de los sistemas de notificación.
Finalmente, incluso si no hay una lib de Python para ninguno de estos, probablemente pueda usar ctypes
para acceder a ellos.