Schreiben von Indikatoren mit Python, GIR und GTK3


18

Ich schreibe eine Anwendung, die einen Indikator verwenden muss. Ich habe dies in der Vergangenheit mit PyGTK und GTK2 durchgeführt und als Referenz dieses Dokuments verwendet: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Dies funktioniert jedoch nur mit PyGTK und GTK2. Die Dinge haben sich seitdem geändert, und ich muss eine gute Dokumentation, ein Tutorial oder ein gutes Beispiel finden, um zu lernen, wie es funktioniert.

Eine Sache, die in dem zuvor erwähnten Dokument überhaupt nicht beschrieben wird, ist das Hinzufügen von Untermenüs zu einem Indikator. Ich hoffe, jemand kann etwas Licht ins Dunkel bringen und auch erläutern, wie man Kategorieanzeigen integriert, wenn dies mit demselben Tool erfolgt.

Vielen Dank.

Antworten:


19

Dies ist mein Testcode für gtk3 und appindicator, der einen Indikator für GPaste erstellt .

Grundsätzlich gilt,

from gi.repository import AppIndicator3 as AppIndicator

um appindicator für gtk3-anwendungen zu verwenden, die im paket enthalten sind gir1.2-appindicator3.

Hier ist die AppIndicator3- Dokumentation.

pygtk ist für Gtk3 veraltet und Sie müssen die GObject-Introspection- Route durchlaufen, um Gtk3-Anwendungen in Python zu entwickeln. Sie können auf die PyGObject-Dokumentation verweisen . Anstatt

import pygtk, gtk, gdk, gobject, pango  

etc solltest du machen

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

Zum Studieren eines Arbeitscodes können Sie Kazam anzeigen, das von gtk2 zu gtk3 gewechselt ist und appindicator3 verwendet .

Es gibt auch ein Paket, gir1.2-appindicatordas anscheinend dasselbe ist wie "using", python-appindicatorda beide die Verwendung für die Anwendung "gtk2" bereitstellen.

from gi.repository import AppIndicator

ODER

import appindicator

Einige Informationen in diesem Blogeintrag .


Ich bin mit AppIndicator3 gegangen. Aber heißt das, dass AppIndicator 1 ein direkter Port von Python-Appindicator ist, während AI3 eine neue Version ist, die nicht zurückportiert wird?
Jo-Erlend Schinstad

Es scheint so. Ich habe appindicator 0.1 aus der Python-Shell geladen und dann versucht, appindicator3 zu laden, was mir diesen Fehler bescherte RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Es scheint also, dass Appindicator 0.1 mit gtk2 funktioniert, dh pygtk und appindicator3 und höher, wenn irgendeiner mit gtk3 funktioniert
sagarchalise

Ah, ich verstehe. Es ist nicht Version 3 von AI. Es ist AI für GTK3 :)
Jo-Erlend Schinstad

Mir ist auch aufgefallen, dass dieser Blogeintrag die Verwendung von AppIndicator3 behandelt , was Sie vielleicht interessant finden.
David Planella

2
Nur eine Anmerkung, die meisten dieser Links sind tot.
RobotHumans

10

Hier ist eine blöde einfache Gerüstanwendung mit einem Konfigurationsfenster, einem Hauptfenster und einer App-Anzeige.

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


8

Hier ist ein Beispiel für das Ablesen der CPU-Temperatur. Kopieren Sie ein Symbol mit dem Namen temp-icon.png / svg in das Skriptverzeichnis

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()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.