问题描述
我正在编写一个需要使用指示器的应用程序。我过去使用 PyGTK 和 GTK2 完成了此操作,并使用此文档作为参考:https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version
但是,这只适用于 PyGTK 和 GTK2。从那时起,事情发生了变化,我需要找到一些好的文档、教程或好的示例来了解它是如何工作的。
另外,前面提到的文档根本没有描述的一件事是如何将 sub-menus 添加到指标。我希望有人能够阐明这一点,以及如何与类别指标集成(如果使用相同的工具完成)。
谢谢。
最佳方案
This 是我的 gtk3 和 appindicator 的试用代码,它为 GPaste 创建一个指标。
基本上,
from gi.repository import AppIndicator3 as AppIndicator
为了将 appindicator 用于 gtk3 应用程序,该应用程序由包 gir1.2-appindicator3
提供。
这是 AppIndicator3 文档。
pygtk 将在 Gtk3 中被弃用,您必须通过 GObject-Introspection 路线在 python 中开发 Gtk3 应用程序。您可以参考 PyGObject documentation 。代替
import pygtk, gtk, gdk, gobject, pango
等等你应该做的
from gi.repository import Gtk, Gdk, Pango, GObject
为了研究工作代码,您可以查看 Kazam ,它已从 gtk2 移动到 gtk3 并使用 appindicator3 。
还有一个包 gir1.2-appindicator
,它似乎与使用 python-appindicator
相同,因为它们都提供 gtk2 应用程序的用法,即:
from gi.repository import AppIndicator
或者
import appindicator
this blog post 中还有一些信息。
次佳方案
这是一个愚蠢的简单脚手架应用程序,它有一个配置窗口、一个主窗口和一个应用程序指示器。
#!/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()