2010-02-10 21 views
46

Estoy buscando Growl -como, biblioteca de notificaciones de Windows globo-tip-like en Python. Imagine escribir código como:Notificador de escritorio multiplataforma en Python

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

.. y que se 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? ¿Es Growl algo que debo instalar por separado?
  • En Windows, supongo que esto puede requerir pywin32?
  • En Linux, asumiendo GNOME, ¿hay una API de GNOME (usando gnome-python) que hace esto?
  • ¿Puedo hacer que las notificaciones sean 'pegajosas' (es decir, que no desaparezcan nunca) en todas las plataformas?

actualización: Mi preferencia es no dependen de los marcos GUI gigantescas como PyQt4 y wxPython para una tarea simple como esto.

+2

Tenga en cuenta que en OSX, hay un notificador por defecto ahora y Growl se ha convertido en comercial (y por lo tanto la mayoría no estándar) Ver [aquí] (http://stackoverflow.com/questions/11814903/send-notification-to-mountain-lion-notification-center). O [aquí] (https://github.com/albertz/music-player/blob/master/notifications.py) para una implementación de Python. – Albert

Respuesta

0

Para un buen soporte multiplataforma, me gustaría ver PyQt. Se agregará algo de peso a su biblioteca, pero han hecho un buen trabajo resolviendo la mayoría de los problemas.

+0

PyQT es demasiado para mi simple requerimiento. Además, implementar aplicaciones con PyQT es un * dolor *: http://arstechnica.com/open-source/guides/2009/03/how-to-deploying-pyqt-applications-on-windows-and-mac-os- x.ars –

7
  • ¿Cómo hacer para escribir que

    Comprobar cómo keyring se encarga de las cuestiones multiplataforma (que es una biblioteca de Python que se conecta a varios motores llavero detectados automáticamente para almacenamiento)

  • Growl no se incluye 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 de tipo Growl. Respectivamente, KNotification para KDE y libnotify para Gnome.

  • Para las ventanas, echa un vistazo a Gruñido, caen de nuevo a la notificación burbujas si no está disponible (con algo en la línea de ToasterBox)

Haz nunca siquiera pensar en hacer las notificaciones pegajoso. Es estúpido, es insensible y es malditamente molesto. Además, debido a personas como usted, se ha hecho no 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.

+0

esto es exactamente cómo abordaría esto si no hay un módulo para ello. upvoted para la lectura de la mente. ahora solo alguien necesita codificarlo ... PD: yo personalmente usaría las burbujas de Qt como una alternativa en todas partes. Son feos, pero cada aplicación GUI que escribo usa qt, por lo que al menos siempre está disponible. –

+2

"* OSX no viene con ningún sistema de notificación integrado *" no es cierto para las últimas versiones de OSX. –

19

Here's a desktop notifier I wrote a few years ago using wxPython - se comporta de forma 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.

+3

¿Con qué licencia se lanza esto? Editar: No importa ... es un tipo de licencia BSD ... gracias por publicar el código como tal. Me duele encontrar bibliotecas o cosas de las que quiero APRENDER que no arriesgarían futuras versiones de mi código. Pero no tengo problemas para dar crédito donde se debe crédito;) – ThantiK

+0

este proyecto migró a https://github.com/stephenmcd/readertray – tc88

17

En Pycon 2010 hubo una presentation on cross-platform Python development. También había una página html que contenía algunos consejos para la notificación multiplataforma. Sin embargo, yo no lo encuentro en línea más, pero he salvado una copia local, y esta es la parte de notificaciones:

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 .

El archivo pitón vinculado es muy interesante, y creo que debería ser capaz de utilizar 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 regresa a sistemas más simples si es necesario. De esta forma, si el usuario tiene, por ejemplo, Growl lo instalará, independientemente de la plataforma.

Puede adaptarlo para proporcionar soporte para otros sistemas de notificación además de los tres mencionados anteriormente.

+1

No sé por qué esta respuesta no tiene más votos ascendentes. Funcionó muy bien desde el primer momento, y es súper fácil de entender. –

+1

Probado notify.py. Necesita ser actualizado con 'import other.pyWx.toasterbox' →' import wx.lib.agw.toasterbox como TB', creo. Pero todavía no hace nada: 'send ('title', 'message')' → 'PyNoAppError: ¡El objeto wx.App debe crearse primero!' – endolith

+0

Básicamente tengo aplicaciones sin ventana y quiero decir' globo ('algo') 'en lugar de' imprimir ('algo') '. ¿Por qué tenemos que pasar por todos los problemas de crear y destruir ventanas y cosas solo para abrir cuadros de diálogo o globos? http://stackoverflow.com/q/1635027/125507 – endolith

1

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 recortada '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) 
Cuestiones relacionadas