使用Python,GIR和GTK3编写指标


18

我正在编写一个需要使用指示器的应用程序。过去,我使用PyGTK和GTK2来完成此操作,并以此文档作为参考:https : //wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

但是,这仅适用于PyGTK和GTK2。从那时起,事情发生了变化,我需要找到一些好的文档,教程或一个好的例子来学习它的工作原理。

另外,前面提到的文档根本没有描述的一件事是如何向指标添加子菜单。我希望有人能对此有所启发,以及如果使用同一工具完成与类别指标的集成,那么我将对此有所启发。

谢谢。

Answers:


19

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

基本上,

from gi.repository import AppIndicator3 as AppIndicator

以便将appindicator用于package所提供的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  

为了研究有效的代码,您可以查看Kazam,它已从gtk2移至gtk3并使用了appindicator3

还有一个gir1.2-appindicator似乎与python-appindicatoruse 相同的软件包,因为它们都提供了gtk2应用程序的用法,即:

from gi.repository import AppIndicator

要么

import appindicator

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


我选择了AppIndicator3。但这是否意味着AppIndicator 1是python-appindicator的直接端口,而AI3是未反向移植的新版本?
2012年

好像是这样。我从python shell加载了appindicator 0.1,然后尝试加载了appindicator3,这给了我这个错误RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded。因此,看来appindicator 0.1适用于gtk2,即pygtk和appindicator3及更高版本(如果有)适用于gtk3
sagarchalise 2012年

知道了 它不是AI的第3版。这是GTK3的AI :)
Jo-Erlend Schinstad'2

我还注意到此博客条目讨论了AppIndicator3的用法,您可能会发现它很有趣。
戴维·普拉内拉

2
只需说明一下,这些链接中的大多数都是无效的。
RobotHumans 2014年

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()


8

这是读取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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.