AppIndicator3: establece el icono del indicador desde el nombre del archivo o GdkPixbuf

AppIndicator3: establece el icono del indicador desde el nombre del archivo o GdkPixbuf

Estoy escribiendo un pequeño Python 3.aplicaciónque utiliza AppIndicator3para colocar un ícono en la barra superior y luego cambiar ese ícono en respuesta a las acciones del usuario. Sencillo, ¿verdad? Debido a que la aplicación es pequeña, debe ejecutarse desde su directorio de origen sin ningún tipo de instalación.

El problema es eseAppIndicator3.set_icon()requiere un strnombre de icono, no una ruta a dicho icono.

¿Cómo puedo persuadir a AppIndicator3 para que me permita darle un nombre de archivo o un archivo Pixbuf? Alternativamente, ¿cómo puedo agregar mi directorio de íconos a la ruta de búsqueda del nombre del ícono? (Lo intenté AppIndicator3.set_icon_theme_path(), pero aún no se reconocen los nombres de mis íconos.

Respuesta1

Para usar uncaminoal icono se ilustra mejor con un ejemplo. En el siguiente ejemplo, mantengo los íconos en el mismo directorio que el script (indicador), lo que parece una solución conveniente en su caso.

La conclusión es que una vez que inició su indicador:

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)

        -------------------------------

puedes cambiar el ícono con:

        self.testindicator.set_icon("/path/to/new/icon/")

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Ejemplo

En el siguiente ejemplo, todos los íconos, nocolor.pngy purple.pngse green.pngalmacenan junto con el script, pero la ruta a los íconos, establecida en

currpath = os.path.dirname(os.path.realpath(__file__))

podría estar en cualquier lugar.

#!/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()

Nota

...que si necesitas actualizar el ícono de unsegundo hilo, necesitas usar

GObject.threads_init()

antes

Gtk.main()

y necesita actualizar la interfaz (ya sea icono o texto indicador) usando:

GObject.idle_add()

como se aplica, por ejemploaquíyaquí.

información relacionada