¿Cómo envío mensajes de texto a las burbujas de notificación?

38

Escribí un código de Python para obtener texto aleatorio en un archivo .txt. Ahora quiero enviar este texto aleatorio al área de notificación mediante el comando 'notificar-enviar'. ¿Como hacemos eso?

Anuroop Kuppam
fuente

Respuestas:

63

Siempre podemos llamar a send-send como un subproceso, por ejemplo, así:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import subprocess

def sendmessage(message):
    subprocess.Popen(['notify-send', message])
    return

Alternativamente, también podríamos instalar python-notify y llamar a la notificación a través de eso:

import pynotify

def sendmessage(title, message):
    pynotify.init("Test")
    notice = pynotify.Notification(title, message)
    notice.show()
    return

Tenga en cuenta que no hay un paquete python3-notify disponible en Ubuntu. Si está utilizando Python 3, deberá usar python3-notify2 . La API para notify2 es la misma: simplemente reemplace pynotifycon notify2.

Takkat
fuente
1
Tuve que usar subprocess.Popen(['notify-send', message])para hacer que el primer ejemplo funcionara.
lgarzo
El segundo a pynotify.init("Test")y pynotify.Notification(title, message).show(). Por cierto estoy “Learning Python la manera dura”, por lo que podría simplemente pasar por alto algo ...
lgarzo
Lo siento por eso. No pude probar esto antes en mi caja en el trabajo, mi problema. Editado los bits faltantes.
Takkat
10

python3

Si bien puede llamar a notify-sendtravés de os.systemo subprocesses posiblemente más coherente con la programación basada en GTK3 para usar la clase de notificación de introspección de objetos .

Un pequeño ejemplo lo mostrará en acción:

from gi.repository import GObject
from gi.repository import Notify

class MyClass(GObject.Object):
    def __init__(self):

        super(MyClass, self).__init__()
        # lets initialise with the application name
        Notify.init("myapp_name")

    def send_notification(self, title, text, file_path_to_icon=""):

        n = Notify.Notification.new(title, text, file_path_to_icon)
        n.show()

my = MyClass()
my.send_notification("this is a title", "this is some text")
fossfreedom
fuente
No solo es más coherente con la programación de Gtk, sino que también es un proceso único: no hay ejecución de fork-exec, por lo que no hay desperdicio de recursos en generar un nuevo proceso solo para enviar una burbuja de notificación, además Popen()llamará a shell para ejecutar el comando, por lo que hay proceso de shell apareciendo también.
Sergiy Kolodyazhnyy
6
import os
mstr='Hello'
os.system('notify-send '+mstr)
Syed 'soleado' I. Tauhidi
fuente
¿Cómo personalizo esta notificación? ¿Como encabezado, imagen en notificación, etc.?
mehulmpt
1
Esta versión es vulnerable a la ejecución arbitraria de comandos.
Steve
5

Para responder a la pregunta de Mehul Mohan y proponer la forma más corta de enviar una notificación con las secciones de título y mensaje:

import os
os.system('notify-send "TITLE" "MESSAGE"')

Poner esto en función puede ser un poco confuso debido a las comillas entre comillas

import os
def message(title, message):
  os.system('notify-send "'+title+'" "'+message+'"')
Anillo de plata
fuente
44
Puedes sugerir una edición para esa publicación.
muru
2
¿Qué pasa con el uso en 'notify-send "{}" "{}"'.format(title, message)lugar de agregar cadenas?
Stam Kaly
5

Para cualquiera que esté mirando esto en +2018, puedo recomendar el paquete notify2 .

Este es un reemplazo de python puro para notify-python, usando python-dbus para comunicarse directamente con el servidor de notificaciones. Es compatible con Python 2 y 3, y sus devoluciones de llamada pueden funcionar con aplicaciones Gtk 3 o Qt 4.

Bárbaro Supremo
fuente
4

Debe usar el paquete notify2 , es un reemplazo para python-notify. Úselo como sigue.

pip install notify2

Y el codigo:

import notify2
notify2.init('app name')
n = notify2.Notification('title', 'message')
n.show()
jcofta
fuente