Indikator penulisan dengan Python, GIR dan GTK3

18

Saya sedang menulis aplikasi yang perlu menggunakan indikator. Saya telah melakukan ini di masa lalu menggunakan PyGTK dan GTK2, menggunakan sebagai referensi dokumen ini: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Namun, itu hanya berfungsi dengan PyGTK dan GTK2. Banyak hal telah berubah sejak saat itu, dan saya perlu menemukan beberapa dokumentasi yang baik, tutorial atau contoh yang baik untuk mempelajari cara kerjanya.

Juga, satu hal yang sama sekali tidak dijelaskan oleh dokumen yang disebutkan sebelumnya, adalah bagaimana menambahkan sub-menu ke suatu indikator. Saya harap seseorang dapat menjelaskan hal ini, serta bagaimana mengintegrasikan dengan indikator kategori jika itu dilakukan dengan menggunakan alat yang sama.

Terima kasih.

Jo-Erlend Schinstad
sumber

Jawaban:

19

Ini adalah kode percobaan saya untuk gtk3 dan appindicator yang membuat indikator untuk GPaste .

Pada dasarnya,

from gi.repository import AppIndicator3 as AppIndicator

untuk menggunakan appindicator untuk aplikasi gtk3 yang disediakan oleh paket gir1.2-appindicator3.

Berikut ini adalah dokumentasi AppIndicator3 .

pygtk akan tidak digunakan lagi untuk Gtk3 dan Anda harus melewati rute GObject-Introspeksi untuk mengembangkan aplikasi Gtk3 dengan python. Anda dapat merujuk ke dokumentasi PyGObject . Dari pada

import pygtk, gtk, gdk, gobject, pango  

dll yang harus Anda lakukan

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

Untuk mempelajari kode yang berfungsi, Anda dapat melihat Kazam yang telah pindah ke gtk3 dari gtk2 dan menggunakan appindicator3 .

Ada paket gir1.2-appindicatorjuga yang tampaknya sama dengan menggunakan python-appindicatorkarena keduanya menyediakan penggunaan untuk aplikasi gtk2 yaitu:

from gi.repository import AppIndicator

ATAU

import appindicator

Beberapa informasi dalam posting blog ini juga.

sagarchalise
sumber
Saya pergi dengan AppIndicator3. Tetapi apakah ini berarti bahwa AppIndicator 1 adalah port langsung dari python-appindicator sedangkan AI3 adalah versi baru yang tidak di-backport?
Jo-Erlend Schinstad
Sepertinya begitu. Saya memuat appindicator 0,1 dari shell python dan kemudian mencoba memuat appindicator3 yang memberi saya kesalahan ini RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Jadi sepertinya appindicator 0.1 bekerja dengan gtk2 yaitu pygtk dan appindicator3 dan di atas jika ada yang bekerja dengan gtk3
sagarchalise
Ah, saya mengerti. Ini bukan versi 3 dari AI. Ini AI untuk GTK3 :)
Jo-Erlend Schinstad
Saya juga memperhatikan entri blog ini membahas penggunaan AppIndicator3 , yang menurut Anda menarik.
David Planella
2
Sekadar catatan, sebagian besar tautan ini sudah mati.
RobotHumans
10

Berikut ini adalah aplikasi perancah sederhana yang bodoh yang memiliki jendela konfigurasi, jendela utama, dan indikator aplikasi.

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

Berikut ini adalah contoh dari membaca suhu cpu. salin ikon bernama temp-icon.png / svg di direktori skrip

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
sumber