Estou escrevendo um pequeno Python 3aplicativoque usa AppIndicator3
para 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 str
nome 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/")
Exemplo
No exemplo abaixo, todos os ícones, nocolor.png
, purple.png
e green.png
sã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()