当前位置: 首页>>技术教程>>正文


使用 Python、GIR 和 GTK3 编写指标

, ,

问题描述

我正在编写一个需要使用指示器的应用程序。我过去使用 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()

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14463.html,未经允许,请勿转载。