Viết các chỉ số bằng Python, GIR và GTK3


18

Tôi đang viết một ứng dụng cần sử dụng một chỉ báo. Tôi đã làm điều này trong quá khứ bằng cách sử dụng PyGTK và GTK2, sử dụng làm tài liệu tham khảo này: https : //wiki.ub Ubuntu.com/DesktopExperienceTeam/ApplicationTheicators#Python_version

Tuy nhiên, điều đó chỉ hoạt động với PyGTK và GTK2. Mọi thứ đã thay đổi kể từ đó, và tôi cần tìm một số tài liệu tốt, một hướng dẫn hoặc một ví dụ tốt để tìm hiểu cách thức hoạt động của nó.

Ngoài ra, một điều mà tài liệu được đề cập trước đó hoàn toàn không mô tả, đó là làm thế nào để thêm các menu phụ vào một chỉ báo. Tôi hy vọng ai đó có thể làm sáng tỏ điều này, cũng như cách tích hợp với các chỉ số danh mục nếu điều đó được thực hiện bằng cùng một công cụ.

Cảm ơn.

Câu trả lời:


19

Đây là mã dùng thử của tôi cho gtk3 và appindicator tạo ra một chỉ báo cho GPaste .

Về cơ bản,

from gi.repository import AppIndicator3 as AppIndicator

để sử dụng appindicator cho các ứng dụng gtk3 được cung cấp theo gói gir1.2-appindicator3.

Dưới đây là tài liệu AppIndicator3 .

pygtk sẽ không được hỗ trợ cho Gtk3 và bạn phải đi qua tuyến đường GObject-Introspection để phát triển các ứng dụng Gtk3 trong python. Bạn có thể tham khảo tài liệu PyGObject . Thay vì

import pygtk, gtk, gdk, gobject, pango  

v.v ... bạn nên làm

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

Để nghiên cứu mã làm việc, bạn có thể xem Kazam đã chuyển sang gtk3 từ gtk2 và sử dụng appindicator3 .

Có một gói gir1.2-appindicatorcũng giống như sử dụng python-appindicatorvì cả hai đều cung cấp cách sử dụng cho ứng dụng gtk2 đó là:

from gi.repository import AppIndicator

HOẶC LÀ

import appindicator

Một số thông tin trong bài viết blog này là tốt.


Tôi đã đi với AppIndicator3. Nhưng điều này có nghĩa là AppIndicator 1 là một cổng trực tiếp của python-appindicator trong khi AI3 là phiên bản mới không được hỗ trợ?
Jo-Erlend Schinstad

Có vẻ như vậy. Tôi đã tải appindicator 0.1 từ python shell và sau đó thử tải appindicator3, lỗi này RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Vì vậy, có vẻ như appindicator 0.1 hoạt động với gtk2 tức là pygtk và appindicator3 trở lên nếu có bất kỳ hoạt động nào với gtk3
sagarchalise

À, tôi hiểu rồi. Đây không phải là phiên bản 3 của AI. Đó là AI cho GTK3 :)
Jo-Erlend Schinstad

Tôi cũng nhận thấy mục blog này thảo luận về việc sử dụng AppIndicator3 , mà bạn có thể thấy thú vị.
David Planella

2
Chỉ cần một lưu ý, hầu hết các liên kết này đã chết.
RobotHumans

10

Đây là một ứng dụng giàn giáo đơn giản ngu ngốc có cửa sổ cấu hình, cửa sổ chính và chỉ báo ứng dụng.

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

Dưới đây là một ví dụ về đọc nhiệt độ cpu. sao chép một biểu tượng có tên temp-icon.png / svg trong thư mục 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.