Escrevendo indicadores com Python, GIR e GTK3

18

Estou escrevendo um aplicativo que precisa usar um indicador. Eu fiz isso no passado usando PyGTK e GTK2, usando como referência este documento: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

No entanto, isso funciona apenas com PyGTK e GTK2. As coisas mudaram desde então, e preciso encontrar uma boa documentação, um tutorial ou um bom exemplo para aprender como funciona.

Além disso, uma coisa que o documento mencionado anteriormente não descreve, é como adicionar submenus a um indicador. Espero que alguém possa esclarecer isso, bem como integrar-se com indicadores de categoria, se isso for feito com a mesma ferramenta.

Obrigado.

Jo-Erlend Schinstad
fonte

Respostas:

19

Este é o meu código de teste para gtk3 e appindicator, que cria um indicador para o GPaste .

Basicamente,

from gi.repository import AppIndicator3 as AppIndicator

para usar o appindicator para aplicativos gtk3, que é fornecido pelo pacote gir1.2-appindicator3.

Aqui está a documentação do AppIndicator3 .

O pygtk será descontinuado para o Gtk3 e você precisará percorrer a rota GObject-Introspection para desenvolver aplicativos Gtk3 em python. Você pode consultar a documentação do PyGObject . Ao invés de

import pygtk, gtk, gdk, gobject, pango  

etc você deve fazer

from gi.repository import Gtk, Gdk, Pango, GObject  

Para estudar um código funcional, você pode visualizar o Kazam, que foi movido para gtk3 a partir de gtk2 e usa appindicator3 .

Também existe um pacote gir1.2-appindicatorque parece ser o mesmo que usar python-appindicator, pois ambos fornecem uso para a aplicação gtk2, que é:

from gi.repository import AppIndicator

OU

import appindicator

Algumas informações nesta postagem do blog também.

sagarchalise
fonte
Eu fui com AppIndicator3. Mas isso significa que o AppIndicator 1 é uma porta direta do python-appindicator, enquanto o AI3 é uma nova versão que não é suportada?
Jo-Erlend Schinstad
Parece que sim. Carreguei o appindicator 0.1 no shell python e tentei carregar o appindicator3, o que me deu esse erro RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Assim, parece appindicator 0.1 funciona com gtk2 ie pygtk e appindicator3 e acima se quaisquer trabalhos com GTK3
sagarchalise
Ah, entendi. Não é a versão 3 do AI. É da AI para GTK3 :)
Jo-Erlend Schinstad
Também notei esta entrada do blog discutindo o uso do AppIndicator3 , que você pode achar interessante.
David Planella
2
Apenas uma observação, a maioria desses links está morta.
precisa saber é o seguinte
10

Aqui está um aplicativo de andaime simples e estúpido que possui uma janela de configuração, uma janela principal e um indicador de aplicativo.

#!/usr/bin/env python3.3

from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator

class MyIndicator:
  def __init__(self, root):
    self.app = root
    self.ind = appindicator.Indicator.new(
                self.app.name,
                "indicator-messages",
                appindicator.IndicatorCategory.APPLICATION_STATUS)
    self.ind.set_status (appindicator.IndicatorStatus.ACTIVE)
    self.menu = Gtk.Menu()
    item = Gtk.MenuItem()
    item.set_label("Main Window")
    item.connect("activate", self.app.main_win.cb_show, '')
    self.menu.append(item)

    item = Gtk.MenuItem()
    item.set_label("Configuration")
    item.connect("activate", self.app.conf_win.cb_show, '')
    self.menu.append(item)

    item = Gtk.MenuItem()
    item.set_label("Exit")
    item.connect("activate", self.cb_exit, '')
    self.menu.append(item)

    self.menu.show_all()
    self.ind.set_menu(self.menu)

  def cb_exit(self, w, data):
     Gtk.main_quit()

class MyConfigWin(Gtk.Window):
  def __init__(self, root):
    super().__init__()
    self.app = root
    self.set_title(self.app.name + ' Config Window')

  def cb_show(self, w, data):
    self.show()

class MyMainWin(Gtk.Window):
  def __init__(self, root):
    super().__init__()
    self.app = root
    self.set_title(self.app.name)

  def cb_show(self, w, data):
    self.show()

class MyApp(Gtk.Application):
  def __init__(self, app_name):
    super().__init__()
    self.name = app_name
    self.main_win = MyMainWin(self)
    self.conf_win = MyConfigWin(self)
    self.indicator = MyIndicator(self)

  def run(self):
    Gtk.main()

if __name__ == '__main__':
  app = MyApp('Scaffold')
  app.run()
RobotHumans
fonte
8

Aqui está um exemplo de leitura da temperatura da CPU. copie um ícone chamado temp-icon.png / svg no diretório de scripts

from gi.repository import Gtk, GLib
from gi.repository import AppIndicator3 as appindicator
import os

def cb_exit(w, data):
   Gtk.main_quit()

def cb_readcputemp(ind_app):
# get CPU temp
   fileh = open(
      '/sys/devices/platform/thinkpad_hwmon/subsystem/devices/coretemp.0/temp1_input',
    'r')
  ind_app.set_label(fileh.read(2), '')
  fileh.close()
  return 1


ind_app = appindicator.Indicator.new_with_path (
  "cputemp-indicator",
   "temp-icon",
   appindicator.IndicatorCategory.APPLICATION_STATUS,
    os.path.dirname(os.path.realpath(__file__)))
ind_app.set_status (appindicator.IndicatorStatus.ACTIVE)

# create a menu
menu = Gtk.Menu()
menu_items = Gtk.MenuItem("Exit")
menu.append(menu_items)
menu_items.connect("activate", cb_exit, '')
menu_items.show()
ind_app.set_menu(menu)
GLib.timeout_add(500, cb_readcputemp, ind_app)
Gtk.main()
Srivatsa Kanchi
fonte