用Python,GIR和GTK3编写指标

我正在编写一个需要使用指标的应用程序。 我以前使用PyGTK和GTK2做过这个,使用这个文档作为参考: https : //wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

但是,这只适用于PyGTK和GTK2。 从那以后情况发生了变化,我需要找到一些好的文档,一个教程或一个很好的例子来了解它是如何工作的。

此外,前面提到的文档根本没有描述的一件事是如何将子菜单添加到指示器。 我希望有人可以对此有所了解,以及如果使用相同的工具完成,如何与类别指标集成。

谢谢。

这是我的gtk3和appindicator的试用代码,它为GPaste创建了一个指标。

基本上,

from gi.repository import AppIndicator3 as AppIndicator 

为了使用由gir1.2-appindicator3包提供的gtk3应用程序gir1.2-appindicator3

这是AppIndicator3文档。

pygtk将被弃用为Gtk3,你必须通过GObject-Introspection路由在python中开发Gtk3应用程序。 您可以参考PyGObject文档 。 代替

 import pygtk, gtk, gdk, gobject, pango 

你应该做的等等

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

为了研究工作代码,你可以查看从gtk2移动到gtk3并使用appindicator3的Kazam 。

有一个包gir1.2-appindicator ,它似乎与使用python-appindicator相同,因为它们都提供了gtk2 python-appindicator用法,它是:

 from gi.repository import AppIndicator 

要么

 import appindicator 

此博客文章中的一些信息也是如此 。

这是一个愚蠢的简单脚手架应用程序,它有一个配置窗口,一个主窗口和一个应用程序指示器。

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

为了防止有人发现它有用,我用Python,GIR和GTK3创建了一个最小的应用程序指示器。 它每隔几秒从/ proc / cpuinfo读取CPU速度并显示它们。

请参见: https : //bitbucket.org/cpbotha/indicator-cpuspeed/src

这是一个读取CPU温度的例子。 在脚本目录中复制名为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()