AppIndicator3: Indikatorsymbol aus Dateinamen oder GdkPixbuf festlegen

AppIndicator3: Indikatorsymbol aus Dateinamen oder GdkPixbuf festlegen

Ich schreibe eine kleine Python 3AppDabei AppIndicator3wird 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 strSymbolnamen, 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/")

Bildbeschreibung hier eingebenBildbeschreibung hier eingeben

Beispiel

Im folgenden Beispiel werden alle Icons, nocolor.png, purple.pngund green.pngzusammen 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()

wie angewendet zBHierUndHier.

verwandte Informationen