Indicatori di scrittura con Python, GIR e GTK3


18

Sto scrivendo un'applicazione che deve utilizzare un indicatore. L'ho fatto in passato usando PyGTK e GTK2, usando come riferimento questo documento: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Tuttavia, funziona solo con PyGTK e GTK2. Da allora le cose sono cambiate e ho bisogno di trovare una buona documentazione, un tutorial o un buon esempio per imparare come funziona.

Inoltre, una cosa che il documento precedentemente citato non descrive affatto è come aggiungere sottomenu a un indicatore. Spero che qualcuno possa far luce su questo e su come integrarsi con gli indicatori di categoria se lo si fa usando lo stesso strumento.

Grazie.

Risposte:


19

Questo è il mio codice di prova per gtk3 e appindicator che crea un indicatore per GPaste .

Fondamentalmente,

from gi.repository import AppIndicator3 as AppIndicator

per usare appindicator per le applicazioni gtk3 fornite dal pacchetto gir1.2-appindicator3.

Ecco la documentazione di AppIndicator3 .

pygtk sarà deprecato per Gtk3 e devi seguire il percorso GObject-Introspection per sviluppare applicazioni Gtk3 in python. È possibile fare riferimento alla documentazione di PyGObject . Invece di

import pygtk, gtk, gdk, gobject, pango  

ecc. dovresti fare

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

Per studiare un codice funzionante, è possibile visualizzare Kazam che è passato a gtk3 da gtk2 e utilizza appindicator3 .

Esiste anche un pacchetto gir1.2-appindicatorche sembra essere uguale all'utilizzo python-appindicatorin quanto entrambi forniscono l'utilizzo per l'applicazione gtk2 che è:

from gi.repository import AppIndicator

O

import appindicator

Alcune informazioni in questo post del blog .


Sono andato con AppIndicator3. Ma questo significa che AppIndicator 1 è una porta diretta di python-appindicator mentre AI3 è una nuova versione che non è supportata?
Jo-Erlend Schinstad,

Sembra così. Ho caricato appindicator 0.1 dalla shell python e poi ho provato a caricare appindicator3 che mi ha dato questo errore RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Quindi sembra che l'appindicator 0.1 funzioni con gtk2, ovvero pygtk e appindicator3 e versioni successive se funziona con gtk3
sagarchalise,

Ah, ho capito. Non è la versione 3 di AI. È AI per GTK3 :)
Jo-Erlend Schinstad,

Ho anche notato questo post sul blog che parla dell'uso di AppIndicator3 , che potresti trovare interessante.
David Planella,

2
Solo una nota, la maggior parte di questi collegamenti sono morti.
RobotHumans,

10

Ecco una stupida semplice applicazione impalcatura che ha una finestra di configurazione, una finestra principale e un indicatore di app.

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

Ecco un esempio di lettura della temperatura della CPU. copia un'icona chiamata temp-icon.png / svg nella directory degli 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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.