Pisanie wskaźników w Pythonie, GIR i GTK3

18

Piszę aplikację, która musi korzystać ze wskaźnika. Zrobiłem to w przeszłości przy użyciu PyGTK i GTK2, używając jako odniesienia tego dokumentu: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Działa to jednak tylko z PyGTK i GTK2. Od tego czasu wszystko się zmieniło i muszę znaleźć dobrą dokumentację, samouczek lub dobry przykład, aby dowiedzieć się, jak to działa.

Ponadto jedną rzeczą, której wspomniany wcześniej dokument w ogóle nie opisuje, jest sposób dodania podmenu do wskaźnika. Mam nadzieję, że ktoś może rzucić nieco światła na to, a także jak zintegrować ze wskaźnikami kategorii, jeśli zrobisz to za pomocą tego samego narzędzia.

Dzięki.

Jo-Erlend Schinstad
źródło

Odpowiedzi:

19

To jest mój kod próbny dla gtk3 i appindicator, który tworzy wskaźnik dla GPaste .

Gruntownie,

from gi.repository import AppIndicator3 as AppIndicator

w celu użycia appindicator dla aplikacji gtk3 dostarczanych przez pakiet gir1.2-appindicator3.

Oto dokumentacja AppIndicator3 .

pygtk będzie przestarzałe dla Gtk3 i musisz przejść przez GObject-Introspection w celu opracowania aplikacji Gtk3 w Pythonie. Możesz zapoznać się z dokumentacją PyGObject . Zamiast

import pygtk, gtk, gdk, gobject, pango  

itp. powinieneś zrobić

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

Aby przestudiować działający kod, możesz zobaczyć Kazama, który przeniósł się do gtk3 z gtk2 i używa appindicator3 .

Istnieje również pakiet, gir1.2-appindicatorktóry wydaje się być taki sam, jak używanie, python-appindicatorponieważ oba zapewniają użycie aplikacji gtk2, czyli:

from gi.repository import AppIndicator

LUB

import appindicator

Niektóre informacje w tym blogu również.

sagarchalizować
źródło
Poszedłem z AppIndicator3. Ale czy to oznacza, że ​​AppIndicator 1 jest bezpośrednim portem python-appindicator, podczas gdy AI3 to nowa wersja, która nie jest backportowana?
Jo-Erlend Schinstad
Tak to wygląda. Załadowałem appindicator 0.1 z powłoki Pythona, a następnie spróbowałem załadować appindicator3, który dał mi ten błąd RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Wygląda więc na to, że appindicator 0.1 działa z gtk2, tj. Pygtk i appindicator3 i wyżej, jeśli którykolwiek działa z gtk3
sagarchalizuj
Ach, rozumiem. To nie jest wersja 3 AI. To AI dla GTK3 :)
Jo-Erlend Schinstad
Zauważyłem również ten wpis na blogu omawiający użycie AppIndicator3 , który może być dla ciebie interesujący.
David Planella
2
Uwaga: większość z tych linków jest martwa.
RobotHumans
10

Oto głupia prosta aplikacja rusztowania, która ma okno konfiguracji, okno główne i wskaźnik aplikacji.

#!/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
źródło
8

Oto przykład odczytu temperatury procesora. skopiuj ikonę o nazwie temp-icon.png / svg do katalogu skryptów

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
źródło