Come posso inviare messaggi di testo alle bolle di notifica?


38

Ho scritto un codice Python per ottenere testo casuale in un file .txt. Ora voglio inviare questo testo a caso nell'area di notifica tramite il comando 'Notify-Send'. Come lo facciamo?

Risposte:


63

Possiamo sempre chiamare notification-send come sottoprocesso, ad esempio in questo modo:

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

import subprocess

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

In alternativa, potremmo anche installare python-notification e chiamare la notifica tramite quella:

import pynotify

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

Si noti che non esiste alcun pacchetto di notifica Python3 disponibile in Ubuntu. Se stai usando Python 3, dovrai usare python3-notify2 . L'API per notify2 è la stessa: basta sostituirla pynotifycon notify2.


1
Ho dovuto usare subprocess.Popen(['notify-send', message])per far funzionare il primo esempio.
Lgarzo,

Il secondo a pynotify.init("Test")e pynotify.Notification(title, message).show(). A proposito, sto "Imparando Python The Hard Way", quindi potrei semplicemente trascurare qualcosa ...
Lgarzo,

Mi dispiace per quello. Non ero in grado di testarlo prima sulla mia scatola al lavoro - il mio male.
Ho

10

python3

Sebbene sia possibile chiamare notify-sendtramite os.systemo subprocessè probabilmente più coerente con la programmazione basata su GTK3 utilizzare la classe Notify gobject-introspection .

Un piccolo esempio lo mostrerà in azione:

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")

Non solo più coerente con la programmazione di Gtk, ma è anche un singolo processo: non c'è nessun fork-exec in corso, quindi nessuno spreco di risorse per generare un nuovo processo solo per inviare una bolla di notifica, inoltre Popen()chiamerà shell per eseguire il comando, quindi c'è esplode anche il processo di shell.
Sergiy Kolodyazhnyy,

6
import os
mstr='Hello'
os.system('notify-send '+mstr)

Come personalizzo questa notifica? Come titolo, immagine nella notifica, ecc.?
Mehulmpt,

1
Questa versione è vulnerabile all'esecuzione arbitraria di comandi.
Steve,

5

Per rispondere alla domanda Mehul Mohan e proporre il modo più breve per inviare una notifica con sezioni titolo e messaggio:

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

Metterlo in funzione potrebbe essere un po 'confuso a causa delle virgolette tra virgolette

import os
def message(title, message):
  os.system('notify-send "'+title+'" "'+message+'"')


2
Che ne dici di usare 'notify-send "{}" "{}"'.format(title, message)piuttosto che aggiungere stringhe?
Stam Kaly,

5

Per chiunque lo guardi in +2018, posso consigliare il pacchetto notify2 .

Questa è una sostituzione pure-python per notification-python, usando python-dbus per comunicare direttamente con il server di notifica. È compatibile con Python 2 e 3 e i suoi callback possono funzionare con applicazioni Gtk 3 o Qt 4.


4

Dovresti usare il pacchetto notify2 , è un sostituto di python-notification. Usalo come seguito.

pip install notify2

E il codice:

import notify2
notify2.init('app name')
n = notify2.Notification('title', 'message')
n.show()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.