Python、GIR、GTK3を使用したインジケーターの作成


18

インジケーターを使用する必要があるアプリケーションを作成しています。過去にPyGTKとGTK2を使用してこれを実行しました。参照としてこのドキュメントを使用します:https : //wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

ただし、それはPyGTKおよびGTK2でのみ機能します。それ以来状況は変化しており、その仕組みを学ぶために、いくつかの優れたドキュメント、チュートリアル、または良い例を見つける必要があります。

また、前述のドキュメントでまったく説明されていないことの1つは、インジケーターにサブメニューを追加する方法です。同じツールを使用してカテゴリインジケータと統合する方法と同様に、誰かがこれに何らかの光を当てることができることを願っています。

ありがとう。

回答:


19

これはのための指標を作成gtk3とappindicatorのための私のトライアルコードですGPasteを

基本的に、

from gi.repository import AppIndicator3 as AppIndicator

packageによって提供されるgtk3アプリケーションにappindicatorを使用するためgir1.2-appindicator3

AppIndicator3のドキュメントは次のとおりです。

PyGTKのは Gtk3で廃止され、あなたが通過する必要がGObjectの-イントロスペクションの pythonでGtk3アプリケーションを開発するためのルート。PyGObjectのドキュメントを参照できます。の代わりに

import pygtk, gtk, gdk, gobject, pango  

など

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

作業コードを研究するために、あなたが見ることができるKazam GTK2や用途からgtk3に移動したappindicator3を

両方ともgtk2アプリケーションの使用法を提供するため、使用gir1.2-appindicatorと同じように見えるパッケージもありますpython-appindicator

from gi.repository import AppIndicator

または

import appindicator

このブログ投稿にもいくつかの情報があります。


AppIndicator3を使用しました。しかし、これは、AppIndicator 1がpython-appindicatorの直接ポートであるのに対し、AI3はバックポートされていない新しいバージョンであることを意味しますか?
ジョーエルレンドシンスタッド

そのようです。私はPythonシェルからappindicator 0.1をロードしてから、このエラーを出したappindicator3をロードしようとしましたRepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded。それはGTK2すなわちPyGTKをとappindicator3とし、上記appindicator 0.1作品を思わもしそうならgtk3を持つ作品
sagarchalise

ああ、わかった。AIのバージョン3ではありません。GTK3のAIです:)
ジョーエルレンドシンスタッド


2
ただ、これらのリンクのほとんどは死んでいます。
RobotHumans 14年

10

これは、設定ウィンドウ、メインウィンドウ、アプリインジケーターを備えた愚かなシンプルなscaffoldアプリケーションです。

#!/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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.