Écriture d'indicateurs avec Python, GIR et GTK3

18

J'écris une application qui doit utiliser un indicateur. J'ai fait cela dans le passé en utilisant PyGTK et GTK2, en utilisant comme référence ce document: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Cependant, cela ne fonctionne qu'avec PyGTK et GTK2. Les choses ont changé depuis lors, et j'ai besoin de trouver une bonne documentation, un tutoriel ou un bon exemple pour apprendre comment cela fonctionne.

De plus, une chose que le document mentionné précédemment ne décrit pas du tout, c'est comment ajouter des sous-menus à un indicateur. J'espère que quelqu'un pourra faire la lumière sur ce sujet, ainsi que sur la façon de s'intégrer aux indicateurs de catégorie si cela se fait à l'aide du même outil.

Merci.

Jo-Erlend Schinstad
la source

Réponses:

19

Ceci est mon code d'essai pour gtk3 et appindicator qui crée un indicateur pour GPaste .

Fondamentalement,

from gi.repository import AppIndicator3 as AppIndicator

afin d'utiliser appindicator pour les applications gtk3 qui est fourni par package gir1.2-appindicator3.

Voici la documentation AppIndicator3 .

pygtk sera obsolète pour Gtk3 et vous devez suivre la route GObject-Introspection pour développer des applications Gtk3 en python. Vous pouvez vous référer à la documentation PyGObject . Au lieu de

import pygtk, gtk, gdk, gobject, pango  

etc vous devez faire

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

Pour étudier un code de travail, vous pouvez voir Kazam qui est passé de gtk2 à gtk3 et utilise appindicator3 .

Il existe également un package gir1.2-appindicatorqui semble être le même que l'utilisation, python-appindicatorcar ils fournissent tous deux une utilisation pour l'application Gtk2 qui est:

from gi.repository import AppIndicator

OU

import appindicator

Quelques informations dans ce billet de blog également.

sagarchalise
la source
Je suis allé avec AppIndicator3. Mais cela signifie-t-il que AppIndicator 1 est un port direct de python-appindicator alors que AI3 est une nouvelle version qui n'est pas rétroportée?
Jo-Erlend Schinstad
Cela semble ainsi. J'ai chargé appindicator 0.1 à partir du shell python, puis j'ai essayé de charger appindicator3, ce qui m'a donné cette erreur RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Il semble donc qu'appindicator 0.1 fonctionne avec gtk2, c'est-à-dire pygtk et appindicator3 et au-dessus si cela fonctionne avec gtk3
sagarchalise
Ah, je comprends. Ce n'est pas la version 3 de l'IA. C'est de l'IA pour GTK3 :)
Jo-Erlend Schinstad
J'ai également remarqué cette entrée de blog discutant de l'utilisation d'AppIndicator3 , qui pourrait vous intéresser.
David Planella
2
Juste une note, la plupart de ces liens sont morts.
RobotHumans
10

Voici une application d'échafaudage simple stupide qui a une fenêtre de configuration, une fenêtre principale et un indicateur d'application.

#!/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()
RobotHumains
la source
9

Juste au cas où quelqu'un pourrait le trouver utile, j'ai fait un indicateur d'application minimal avec Python, GIR et GTK3. Il lit les vitesses du processeur à partir de / proc / cpuinfo toutes les quelques secondes et les affiche.

Voir ici: https://bitbucket.org/cpbotha/indicator-cpuspeed/src

Charl Botha
la source
8

Voici un exemple de lecture de la température du processeur. copiez une icône nommée temp-icon.png / svg dans le répertoire de script

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
la source