web-dev-qa-db-fra.com

Écriture d'indicateurs avec Python, GIR et GTK3

J'écris une application qui doit utiliser un indicateur. J'ai déjà utilisé PyGTK et GTK2 en 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 et je dois trouver une bonne documentation, un tutoriel ou un bon exemple pour en apprendre plus sur son fonctionnement.

De plus, le document mentionné précédemment ne décrit absolument pas comment ajouter des sous-menus à un indicateur. J'espère que quelqu'un pourra nous éclairer à ce sujet, ainsi que sur la manière d'intégrer les indicateurs de catégorie si cela est fait avec le même outil.

Merci.

18
Jo-Erlend Schinstad

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

Fondamentalement,

from gi.repository import AppIndicator3 as AppIndicator

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

Voici la documentation AppIndicator .

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

import pygtk, gtk, gdk, gobject, pango  

etc tu devrais 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 appindicator .

Il existe également un paquetage gir1.2-appindicator qui semble identique à l'utilisation de python-appindicator car ils fournissent tous deux une utilisation pour l'application gtk2 qui est:

from gi.repository import AppIndicator

OR

import appindicator

Quelques informations dans cet article de blog également.

19
sagarchalise

Voici une application d'échafaudage simple et 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 __== '__main__':
  app = MyApp('Scaffold')
  app.run()
10
RobotHumans

Juste au cas où quelqu'un trouverait cela utile, j'ai créé un indicateur d'application minimal avec Python, GIR et GTK3. Il lit les vitesses du processeur dans/proc/cpuinfo toutes les quelques secondes et les affiche.

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

9
Charl Botha

Voici un exemple de lecture de la température du processeur. copier une icône nommée temp-icon.png/svg dans le répertoire du 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()
8
Srivatsa Kanchi