Python, GIR ve GTK3 ile gösterge yazma


18

Gösterge kullanması gereken bir uygulama yazıyorum. Bunu geçmişte bu belgeye referans olarak kullanarak PyGTK ve GTK2 kullanarak yaptım: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Ancak, bu yalnızca PyGTK ve GTK2 ile çalışır. O zamandan beri işler değişti ve nasıl çalıştığını öğrenmek için bazı iyi belgeler, bir öğretici veya iyi bir örnek bulmam gerekiyor.

Ayrıca, daha önce sözü edilen belgenin hiç tarif etmediği bir şey, bir göstergeye alt menülerin nasıl ekleneceğidir. Umarım birisi buna biraz ışık tutabilir ve aynı araç kullanılarak yapılırsa kategori göstergelerine nasıl entegre edilebilir.

Teşekkürler.

Yanıtlar:


19

Bu , GPaste için bir gösterge oluşturan gtk3 ve appindicator için deneme kodum .

Temel olarak,

from gi.repository import AppIndicator3 as AppIndicator

paket tarafından sağlanan gtk3 uygulamaları için appindicator kullanmak gir1.2-appindicator3.

İşte AppIndicator3 belgeleri.

pygtk , Gtk3 için kullanımdan kaldırılacak ve Python'da Gtk3 uygulamaları geliştirmek için GObject-Introspection yolundan geçmeniz gerekiyor. PyGObject belgelerine başvurabilirsiniz . Onun yerine

import pygtk, gtk, gdk, gobject, pango  

vs yapmalısın

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

Çalışan bir kod okuyan için, görüntüleyebilir Kazam gtk2 ve kullanımları gelen gtk3 taşındı appindicator3 .

Her ikisi de gtk2 uygulaması için kullanım sağlamakla gir1.2-appindicatoraynı gibi görünen bir paket python-appindicatorvar:

from gi.repository import AppIndicator

VEYA

import appindicator

Bu blog yazısında da bazı bilgiler var .


AppIndicator3 ile gittim. Ancak bu, AppIndicator 1'in doğrudan bir python-appindicator portu olduğu anlamına gelirken, AI3, desteklenmeyen yeni bir sürümdür?
Jo-Erlend Schinstad

Öyle görünüyor. Python kabuğundan appindicator 0.1'i yükledim ve sonra bana bu hatayı veren appindicator3'ü yüklemeyi denedim RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Yani appindicator 0.1 gtk2 ile çalışıyor gibi görünüyor yani pygtk ve appindicator3 ve üzeri gtk3 ile çalışırsa
sagarchalise

Ah, anladım. AI'nin 3. sürümü değil. GTK3 için AI :)
Jo-Erlend Schinstad

Ayrıca ilginç bulabileceğiniz AppIndicator3 kullanımını tartışan bu blog girişini de fark ettim .
David Planella

2
Sadece bir not, bu bağlantıların çoğu öldü.
RobotHumans

10

İşte bir yapılandırma penceresi, ana pencere ve bir uygulama göstergesi olan aptal basit bir iskele uygulaması.

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

İşte cpu sıcaklığı okumaya bir örnek. script dizinine temp-icon.png / svg adlı bir simgeyi kopyalayın

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.