AppIndicator3: Defina o ícone do indicador do nome do arquivo ou GdkPixbuf

AppIndicator3: Defina o ícone do indicador do nome do arquivo ou GdkPixbuf

Estou escrevendo um pequeno Python 3aplicativoque usa AppIndicator3para colocar um ícone na barra superior e, em seguida, alterar esse ícone em resposta às ações do usuário. Simples, certo? Como o aplicativo é pequeno, ele precisa ser executado a partir do diretório de origem sem qualquer tipo de instalação.

O problema é queAppIndicator3.set_icon()requer um strnome de ícone, não um caminho para esse ícone.

Como posso persuadir o AppIndicator3 a me permitir fornecer um nome de arquivo ou um nome de arquivo Pixbuf? Alternativamente, como posso adicionar meu diretório de ícones ao caminho de pesquisa do nome do ícone? (Eu tentei AppIndicator3.set_icon_theme_path(), mas os nomes dos meus ícones ainda não são reconhecidos.

Responder1

Para usar umcaminhoao ícone é melhor ilustrado com um exemplo. No exemplo abaixo, mantenho os ícones no mesmo diretório do script (indicador), o que parece uma solução conveniente no seu caso.

O resultado final é que, depois de iniciar seu 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)

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

você pode alterar o ícone com:

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

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Exemplo

No exemplo abaixo, todos os ícones, nocolor.png, purple.pnge green.pngsão armazenados junto com o script, mas o caminho para os ícones, definido em

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

poderia estar em qualquer 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()

Observação

...que se você precisar atualizar o ícone de umsegundo tópico, você precisa usar

GObject.threads_init()

antes

Gtk.main()

e você precisa atualizar a interface (ícone ou texto do indicador) usando:

GObject.idle_add()

conforme aplicado, por exemploaquieaqui.

informação relacionada