Jak wysyłać wiadomości tekstowe na bąbelki powiadomień?


38

Napisałem kod Pythona do pobierania losowego tekstu do pliku .txt. Teraz chcę wysłać ten losowy tekst do obszaru powiadomień za pomocą polecenia „powiadom-wyślij”. Jak to zrobimy?

Odpowiedzi:


63

Zawsze możemy zadzwonić do send-send jako podproces, np. W ten sposób:

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

import subprocess

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

Alternatywnie możemy również zainstalować python-powiadomienie i wywołać powiadomienie poprzez:

import pynotify

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

Zauważ, że w Ubuntu nie ma dostępnego pakietu powiadomień python3. Jeśli używasz Python 3, będziesz musiał użyć python3-powiadomienie2 . API dla notify2 jest taka sama: po prostu zastąpić pynotifyz notify2.


1
Musiałem użyć, subprocess.Popen(['notify-send', message])aby pierwszy przykład zadziałał.
lgarzo

Drugi a pynotify.init("Test")i pynotify.Notification(title, message).show(). Nawiasem mówiąc, „uczę się Python The Hard Way”, więc mogę po prostu coś przeoczyć ...
lgarzo

Przykro mi z tego powodu. Nie byłem w stanie przetestować tego wcześniej na moim komputerze w pracy - mój zły.
Edytowałem

10

python3

Podczas gdy możesz dzwonić notify-sendprzez os.systemlub subprocessjest to prawdopodobnie bardziej spójne z programowaniem opartym na GTK3, aby korzystać z klasy gobject-introspection Notify .

Mały przykład pokaże to w akcji:

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

Nie tylko jest bardziej spójny z programowaniem Gtk, ale także jest to pojedynczy proces: nie ma tu działania fork-exec, więc nie marnuje się zasobów na spawnowanie nowego procesu tylko po to, aby wysłać bąbelek powiadomień, a ponadto Popen()wywoła powłokę, aby uruchomić polecenie, więc jest wyskakuje również proces powłoki.
Sergiy Kolodyazhnyy


5

Aby odpowiedzieć na pytanie Mehula Mohana, a także zaproponować najkrótszy sposób przekazania powiadomienia z sekcjami tytułu i wiadomości:

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

Włączenie tej funkcji może być nieco mylące ze względu na cytaty w cudzysłowach

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

4
Możesz zasugerować edycję tego wpisu.
muru

2
Co powiesz na używanie 'notify-send "{}" "{}"'.format(title, message)zamiast dodawania ciągów?
Stam Kaly

4

Dla każdego, kto patrzy na to w +2018, mogę polecić pakiet powiadomienie2 .

Jest to czysto-pythonowy zamiennik dla powiadomienia-python, wykorzystujący python-dbus do bezpośredniej komunikacji z serwerem powiadomień. Jest kompatybilny z Python 2 i 3, a jego wywołania zwrotne mogą współpracować z aplikacjami Gtk 3 lub Qt 4.


3

Powinieneś użyć pakietu replace2, który zastępuje python-powiadomienie. Użyj go w następujący sposób.

pip install notify2

I kod:

import notify2
notify2.init('app name')
n = notify2.Notification('title', 'message')
n.show()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.