pynotify: Python-Skript zeigt Notify-OSD Bubbles

Veröffentlicht am

Naja, ich bin ja, was Python angeht, noch blutiger Anfänger. Aber ich muss sagen, dass ich Gefallen daran gefunden habe und immer wieder gerne ein Python-Skript zusammenschreibe, um meine Ideen umzusetzen. Wem es da ähnlich geht wie mir, der wird vielleicht auch schon einmal den Wunsch gehabt haben, coole System-Meldungen auszugeben.

Mal abgesehen davon, dass das sogar per einfachem Shell-Befehl geht (wobei ich nicht weiß, in welchem Umfang), gibt es auch eine elegante Möglichkeit, Notify-OSD Meldungen aus Python-Programmen heraus anzuzeigen. Mit pynotify

Eine erste Meldung

Gehen wir einfach gleich ans Eingemachte. Für komplette Anfänger sei gesagt, dass ich hier nicht gaaaanz am Anfang anfange. Ihr solltet schon mal ein kleines Python-Skript geschrieben haben und wissen, wie ihr diese zum Laufen bekommt. Wollt ihr die Basics erlernen, hilft euch sicher das Tutorial (eine übersetzte, deutsche Version gibt’s hier) weiter.

Ok, zurück zum eigentlichen Thema: pynotify. Zunächst müssen wir pynotify importieren, also:

import pynotify

Dann initialisieren wir pynotify mit einem eindeutigen, selbst gewählten Anwendungsnamen:

pynotify.init("MeinPyNotifyTest")

Was diese Initialisierung genau bewirkt und was es mit dem Namen auf sich hat, kann ich euch nicht wirklich sagen. Ich habe hierzu leider keine genaue Beschreibung gefunden.

Jetzt können wir eine erste Nachricht erzeugen und senden:

msg = pynotify.Notification("Hallo Welt", "Ich war hier!")
msg.show()

Gut. Das waren auch schon die Grundlagen. Wenn ihr das Skript ausführt, dann solltet ihr eine Meldungs-Blase angezeigt bekommen, die ungefähr so aussieht:

Eine erste Meldung mit pynotify

Macht sich doch schon ganz gut, oder? Aber da ist natürlich Potenzial zur Verbesserung…

Die Meldungen verfeinern

Icons anzeigen

Ein erster Schritt, die Meldung optisch noch etwas aufzuhübschen, ist die Platzierung eines Icons in der Blase. Dabei kann man zunächst einmal auf einen Vorrat an Standard-Icons zurückgreifen. Eine Liste dieser Standard-Icons könnt ihr euch im Ubuntu-Wiki bei Canonical ansehen. Als Beispiel picken wir uns das Icon notification-message-im heraus (das ist in der Liste zwar mit großem IM geschrieben, es funktioniert aber nur mit Kleinbuchstaben!). Um unsere erste „Hallo Welt“-Nachricht mit dem Icon zu versehen, müssen wir einfach nur den Identifier des Icons als drittes Argument angeben, also:

msg = pynotify.Notification("Hallo Welt", "Ich war hier!", "notification-message-im")

Eine Meldung mit Icon

Außerdem können auch eigene Bilder in die Meldungen eingebunden werden. Dazu müssen wir os importieren. Dann können wir so ein eigenes Bild für unsere Meldung angeben:

import os
image = os.path.realpath("/path/to/mamu.png")
msg = pynotify.Notification("Hallo Welt", "Ich war hier!", image)

Sieht das Ergebnis nicht wunderbar aus? 😉

Meldung mit eigenem Bild

Meldungen anhängen

Ein weiteres nettes Feature ist das Anhängen von Zeilen an bereits bestehende Meldungen. Dabei geben wir den Meldungen jeweils einen entsprechenden Hinweis mit. Zunächst unsere anfängliche Meldung:

msg = pynotify.Notification("Hallo Welt", "Ich war hier!")
msg.set_hint_string("append", "")
msg.show()

Dann hängen wir eine weitere Zeile an die Meldung dran. Damit das Beispiel deutlicher wird, warten wir vor dem anhängen zwei Sekunden:

import time
time.sleep(2)
msg = pynotify.Notification("Hallo Welt", "Und ich auch!")
msg.set_hint_string("append, "")
msg.show()

Den time-Import brauchen wir natürlich nur für die Verzögerung. Anzumerken ist hierbei, dass der Titel der Meldungen (das erste String-Argument) jeweils gleich sein muss. Ansonsten werden trotzdem zwei getrennte Meldungen angezeigt.

Meldungen updaten

Neben dem Anhängen von Zeilen kann es manchmal aber auch sinnvoll sein, ganze Meldungen auszutauschen. Schaut euch mal das folgende Beispiel an:

msg = pynotify.Notification("Leise!", "Bitte alle mal leise sein", "notification-audio-volume-muted")
msg.show()
import time
time.sleep(2)
msg.update("Okay", "Jetzt koennt ihr wieder", "notification-audio-volume-high")
msg.show()

Zunächst wird hier eine Meldung gesendet. Dann zwei Sekunden gewartet. Im Anschluss wird die bestehende Meldung per update verändert (und zwar sowohl Titel und Nachrichtentext als auch das Icon) und die geänderte Meldung angezeigt.

Was gibt’s sonst noch?

Man kann die Dauer der Anzeige selbst festlegen. Die Angabe erfolgt in Millisekunden (natürlich vor dem msg.show():

msg.set_timeout(2000)

Um Umlaute oder sonstige spezielle Zeichen in den Meldungen benutzen zu können, muss man übrigens nur das Encoding am Anfang der Python-Quelldatei auf UTF-8 stellen:

# -*- coding: utf8 -*-

Zeilenumbrüche können mit \n eingefügt werden, allerdings nur im Nachrichten-Text, nicht im Titel.

Außerdem sei noch erwähnt, dass es eine Funktion namens get_server_caps gibt, mit deren Hilfe man abfragen kann, welche der o.g. Funktionen vom System überhaupt unterstützt sind. Ich spare mir hier den Abschnitt, weil ich hier sowieso nur von Ubuntu spreche (und ich somit davon ausgehe, dass die Capabilities jeweils gleich sind).

Auch möchte ich noch anmerken, dass man mit der selben API auch herkömmliche Message-Dialoge einblenden kann. Da kann man dann auch eigene Buttons einfügen und auf die verschiedenen Buttons-Klicks reagieren.

Wer nähere Informationen sucht, den möchte ich gerne wieder an die entsprechende Seite im Ubuntu-Wiki von Canonical verweisen.


Dieser Artikel wurde in der/den Kategorie(n) Planet-U, Programmierung und Skripting veröffentlicht und mit den Tags , , , versehen.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>