ตัวบ่งชี้การเขียนด้วย Python, GIR และ GTK3


18

ฉันกำลังเขียนแอปพลิเคชันที่จำเป็นต้องใช้ตัวบ่งชี้ ฉันเคยทำสิ่งนี้มาแล้วในอดีตโดยใช้ PyGTK และ GTK2 โดยใช้เป็นเอกสารอ้างอิงนี้: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

อย่างไรก็ตามนั่นใช้ได้กับ PyGTK และ GTK2 เท่านั้น สิ่งต่าง ๆ มีการเปลี่ยนแปลงตั้งแต่นั้นมาและฉันต้องการค้นหาเอกสารที่ดีการสอนหรือตัวอย่างที่ดีในการเรียนรู้วิธีการทำงาน

นอกจากนี้สิ่งหนึ่งที่เอกสารที่กล่าวถึงก่อนหน้านี้ไม่ได้อธิบายเลยก็คือวิธีการเพิ่มเมนูย่อยเข้ากับตัวบ่งชี้ ฉันหวังว่าบางคนสามารถทำให้กระจ่างในเรื่องนี้รวมถึงวิธีการรวมเข้ากับตัวบ่งชี้หมวดหมู่หากทำได้โดยใช้เครื่องมือเดียวกัน

ขอบคุณ

คำตอบ:


19

นี้เป็นรหัสการพิจารณาคดีของฉันสำหรับ gtk3 และ appindicator ซึ่งจะสร้างตัวบ่งชี้สำหรับGPaste

โดยทั่วไป

from gi.repository import AppIndicator3 as AppIndicator

เพื่อใช้สำหรับการใช้งาน appindicator gtk3 gir1.2-appindicator3ที่ให้บริการโดยแพคเกจ

นี่คือเอกสารAppIndicator3

pygtkจะเลิกใช้สำหรับ Gtk3 และคุณต้องผ่านเส้นทางGObject-Introspectionเพื่อพัฒนาแอปพลิเคชั่น Gtk3 ในหลาม คุณสามารถดูเอกสาร PyGObject แทน

import pygtk, gtk, gdk, gobject, pango  

ฯลฯ คุณควรทำ

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

สำหรับการศึกษารหัสการทำงานคุณสามารถดูKazamซึ่งได้ย้ายไป gtk3 จาก GTK2 และการใช้appindicator3

มีแพ็กเกจgir1.2-appindicatorเช่นกันซึ่งดูเหมือนว่าจะเหมือนกันกับการใช้งานpython-appindicatorเนื่องจากทั้งคู่ให้การใช้งานแอป gtk2 ซึ่งก็คือ:

from gi.repository import AppIndicator

หรือ

import appindicator

ข้อมูลบางส่วนในโพสต์บล็อกนี้เช่นกัน


ฉันไปกับ AppIndicator3 แต่นี่หมายความว่า AppIndicator 1 เป็นพอร์ตโดยตรงของ python-appindicator ในขณะที่ AI3 เป็นรุ่นใหม่ที่ไม่ได้รับการย้อนกลับ?
Jo-Erlend Schinstad

ดูเหมือนว่าเป็นเช่นนั้น ฉันโหลด appindicator 0.1 จาก python shell แล้วลองโหลด appindicator3 ซึ่งทำให้ฉันมีข้อผิดพลาดRepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loadedนี้ ดังนั้นดูเหมือนว่า appindicator 0.1 จะทำงานกับ gtk2 เช่น pygtk และ appindicator3 ขึ้นไปหากใช้งานกับ gtk3 ได้
sagarchalise

อ่าฉันเข้าใจแล้ว ไม่ใช่ AI เวอร์ชัน 3 เป็น AI สำหรับ GTK3 :)
Jo-Erlend Schinstad

ฉันยังสังเกตเห็นรายการบล็อกนี้พูดถึงการใช้ AppIndicator3ซึ่งคุณอาจพบว่าน่าสนใจ
David Planella

2
เพียงทราบลิงค์ส่วนใหญ่เหล่านี้จะตาย
RobotHumans

10

นี่คือแอพพลิเคชั่นนั่งร้านเรียบง่ายที่มีหน้าต่างปรับแต่งหน้าต่างหลักและตัวบ่งชี้แอป

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

9

ในกรณีที่บางคนอาจพบว่ามีประโยชน์ฉันก็สร้างตัวบ่งชี้แอพขั้นต่ำด้วย Python, GIR และ GTK3 มันอ่านความเร็วของ CPU จาก / proc / cpuinfo ทุกสองสามวินาทีและแสดงมัน

ดูที่นี่: https://bitbucket.org/cpbotha/indicator-cpuspeed/src


8

นี่คือตัวอย่างของการอ่านอุณหภูมิซีพียู คัดลอกไอคอนชื่อ temp-icon.png / svg ในไดเรกทอรีสคริปต์

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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.