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

4

Estou escrevendo um pequeno aplicativo do Python 3, que usa AppIndicator3 para colocar um ícone na barra superior, e, em seguida, altere esse ícone em resposta a 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 é que AppIndicator3.set_icon() requer um str com um nome de ícone, não um caminho para o ícone mencionado.

Como posso persuadir o AppIndicator3 a deixar um nome de arquivo ou um Pixbuf ? Como alternativa, 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 foram reconhecidos.

    
por Scott Severance 10.05.2016 / 02:55

1 resposta

4

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

O resultado é que, quando você iniciou 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/")

Exemplo

Noexemploabaixo,todososícones,nocolor.png,purple.pngegreen.pngsãoarmazenadosjuntoscomoscript,masocaminhoparaosícones,definidoem

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

podeestaremqualquerlugar.

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

... se você precisar atualizar o ícone de um segundo thread , precisará usar

GObject.threads_init()

antes

Gtk.main()

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

GObject.idle_add()

como aplicado, e. aqui e aqui .

    
por Jacob Vlijm 10.05.2016 / 23:11