Frage Schreiben von Indikatoren mit Python, GIR und GTK3


Ich schreibe eine Anwendung, die einen Indikator verwenden muss. Ich habe dies in der Vergangenheit mit PyGTK und GTK2 getan, indem ich dieses Dokument als Referenz benutzte: 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 dafür finden, wie es funktioniert.

Eine Sache, die das oben erwähnte Dokument überhaupt nicht beschreibt, ist das Hinzufügen von Untermenüs zu einem Indikator. Ich hoffe, dass jemand etwas darüber aufklären kann, und wie man sich mit Kategorieindikatoren integrieren kann, wenn dies mit dem gleichen Werkzeug gemacht wird.

Vielen Dank.


18
2018-02-26 21:23


Ursprung




Antworten:


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

Grundsätzlich gilt,

from gi.repository import AppIndicator3 as AppIndicator

um appindicator für gtk3-Anwendungen zu verwenden, die vom Paket bereitgestellt werden gir1.2-appindicator3.

Hier ist das AppIndikator3 Dokumentation.

pygtk wird für Gtk3 veraltet sein und du musst durchgehen GObjekt-Introspektion Route für die Entwicklung von Gtk3-Anwendungen in Python. Sie können sich darauf beziehen PyGObject-Dokumentation. Anstatt von

import pygtk, gtk, gdk, gobject, pango  

usw. sollten Sie tun

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

Um einen Arbeitscode zu studieren, könnten Sie sich ansehen Kazam welches von gtk2 nach gtk3 verschoben wurde und verwendet appindikator3.

Es gibt ein Paket gir1.2-appindicator auch das scheint das gleiche wie zu verwenden python-appindicator da sie beide eine Nutzung für die gtk2-Appplikation bieten, nämlich:

from gi.repository import AppIndicator

ODER

import appindicator

Einige Informationen in dieser Blogbeitrag auch.


19
2018-02-27 15:35



Ich ging mit AppIndicator3. Aber bedeutet 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 gab RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Es scheint also, dass appindicator 0.1 mit gtk2, d. H. Pygtk und appindicator3 und höher arbeitet, wenn einer mit gtk3 arbeitet - sagarchalise
Ah, ich verstehe es. Es ist nicht Version 3 von AI. Es ist AI für GTK3 :) - Jo-Erlend Schinstad
Das habe ich auch bemerkt Blogeintrag zur Verwendung von AppIndicator3, die Sie vielleicht interessant finden. - David Planella
Nur eine Anmerkung, die meisten dieser Links sind tot. - RobotHumans


Hier ist eine dumme einfache Scaffold-Anwendung, die ein Konfigurationsfenster, ein Hauptfenster und einen App-Indikator hat.

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

10
2018-01-23 01:05





Für den Fall, dass jemand es nützlich finden könnte, habe ich einen minimalen App-Indikator mit Python, GIR und GTK3 erstellt. Es liest alle paar Sekunden die CPU-Geschwindigkeit von / proc / cpuinfo und zeigt sie an.

Siehe hier: https://bitbucket.org/cpbotha/indicator-cpuspeed/src


9
2018-05-13 15:17





Hier ist ein Beispiel für das Lesen der CPU-Temperatur. Kopieren Sie ein Symbol namens 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()

8
2018-05-29 06:09