Comment envoyer des messages texte aux bulles de notification?

39

J'ai écrit un code python pour obtenir du texte aléatoire dans un fichier .txt. Maintenant, je veux envoyer ce texte au hasard dans la zone de notification via la commande 'notify-send'. Comment fait-on cela?

Anuroop Kuppam
la source

Réponses:

64

Nous pouvons toujours appeler notify-send en tant que sous-processus, par exemple comme ceci:

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

import subprocess

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

Alternativement, nous pourrions également installer python-notify et appeler la notification par le biais:

import pynotify

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

Notez qu'il n'y a pas de paquet python3-notify disponible dans Ubuntu. Si vous utilisez Python 3, vous devrez utiliser python3-notify2 . L'API de notify2 est la même: il suffit de remplacer pynotifypar notify2.

Takkat
la source
1
J'ai dû utiliser subprocess.Popen(['notify-send', message])pour faire fonctionner le premier exemple.
lgarzo
Le second a pynotify.init("Test")et pynotify.Notification(title, message).show(). En passant, je suis "l'apprentissage de Python à la dure", alors je pourrais peut-être oublier quelque chose ...
lundi
Tellement désolé pour cela. J'étais incapable de tester cela plus tôt sur ma boîte au travail - mon mauvais. Edité les bits manquants
po
10

python3

Vous pouvez appeler notify-sendvia os.systemou subprocessil est sans doute plus cohérent avec la programmation basée sur GTK3 d’utiliser la classe Notify gobject-introspection .

Un petit exemple montrera ceci en action:

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
la source
Non seulement plus cohérente avec la programmation de Gtk, mais aussi un processus unique: il n’ya pas d’exécution de fork, donc pas de gaspillage de ressources lors de la création d’un nouveau processus juste pour envoyer une bulle de notification, et Popen()appelera shell pour exécuter la commande. processus shell surgissant aussi.
Sergiy Kolodyazhnyy
6
import os
mstr='Hello'
os.system('notify-send '+mstr)
Syed 'ensoleillé' I. Tauhidi
la source
Comment personnaliser cette notification? Comme en-tête, image dans la notification, etc.?
mehulmpt
1
Cette version est vulnérable à l'exécution de commandes arbitraires.
Steve
5

Pour répondre à la question de Mehul Mohan et proposer le moyen le plus rapide de transmettre une notification avec des sections de titre et de message:

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

Mettre cela en fonction pourrait être un peu déroutant à cause des guillemets entre guillemets

import os
def message(title, message):
  os.system('notify-send "'+title+'" "'+message+'"')
Ringvee d'argent
la source
4
Vous pouvez suggérer une modification à ce post.
Muru
2
Qu'en est-il d'utiliser 'notify-send "{}" "{}"'.format(title, message)plutôt que d'ajouter des chaînes?
Stam Kaly
5

Pour ceux qui regarderont ceci en +2018, je peux recommander le paquet notify2 .

Il s’agit d’un remplacement purement python pour notify-python, qui utilise python-dbus pour communiquer directement avec le serveur de notifications. Il est compatible avec Python 2 et 3 et ses rappels peuvent fonctionner avec les applications Gtk 3 ou Qt 4.

Suprême barbare
la source
4

Vous devriez utiliser le paquet notify2 , il remplace Python-notify. Utilisez-le comme suit.

pip install notify2

Et le code:

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