Ich schreibe eine kleine Python 3AppDabei AppIndicator3
wird ein Symbol in der oberen Leiste platziert und dieses Symbol dann als Reaktion auf Benutzeraktionen geändert. Einfach, oder? Da die App klein ist, muss sie ohne jegliche Installation aus ihrem Quellverzeichnis ausgeführt werden.
Das Problem ist, dassAppIndicator3.set_icon()
erfordert einen str
Symbolnamen, nicht einen Pfad zu diesem Symbol.
Wie kann ich AppIndicator3 dazu bringen, mir entweder einen Dateinamen oder einen zu erlauben Pixbuf
? Oder wie kann ich alternativ mein Symbolverzeichnis zum Symbolnamen-Suchpfad hinzufügen? (Ich habe es versucht AppIndicator3.set_icon_theme_path()
, aber meine Symbolnamen werden immer noch nicht erkannt.
Antwort1
Um einenWegzum Symbol lässt sich am besten anhand eines Beispiels veranschaulichen. Im folgenden Beispiel behalte ich die Symbole im selben Verzeichnis wie das Skript (den Indikator), was in Ihrem Fall eine praktische Lösung zu sein scheint.
Unter dem Strich gilt: Sobald Sie Ihren Indikator initiiert haben:
class Indicator():
def __init__(self):
self.app = "<indicator_name>"
iconpath = "/path/to/initial/icon/"
-------------------------------
self.testindicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
-------------------------------
Sie können das Symbol ändern mit:
self.testindicator.set_icon("/path/to/new/icon/")
Beispiel
Im folgenden Beispiel werden alle Icons, nocolor.png
, purple.png
und green.png
zusammen mit dem Skript gespeichert, aber der Pfad zu den Icons, der in
currpath = os.path.dirname(os.path.realpath(__file__))
könnte überall sein.
#!/usr/bin/env python3
import os
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3
currpath = os.path.dirname(os.path.realpath(__file__))
class Indicator():
def __init__(self):
self.app = 'show_proc'
iconpath = currpath+"/nocolor.png"
# after you defined the initial indicator, you can alter the icon!
self.testindicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.testindicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.testindicator.set_menu(self.create_menu())
def create_menu(self):
menu = Gtk.Menu()
item_quit = Gtk.MenuItem(label='Quit')
item_quit.connect('activate', self.stop)
item_green = Gtk.MenuItem(label='Green')
item_green.connect('activate', self.green)
item_purple = Gtk.MenuItem(label='Purple')
item_purple.connect('activate', self.purple)
menu.append(item_quit)
menu.append(item_green)
menu.append(item_purple)
menu.show_all()
return menu
def stop(self, source):
Gtk.main_quit()
def green(self, source):
self.testindicator.set_icon(currpath+"/green.png")
def purple(self, source):
self.testindicator.set_icon(currpath+"/purple.png")
Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Notiz
...dass Sie, wenn Sie das Symbol von einemzweiter Threadverwenden Sie
GObject.threads_init()
Vor
Gtk.main()
und Sie müssen die Schnittstelle (entweder Symbol oder Anzeigetext) aktualisieren, indem Sie Folgendes verwenden:
GObject.idle_add()