回答:
何がすでにこの質問をする機会であると考えられるので、答えた(で、私はそれが行われたかの拡張説明として、この質問に答えるのですがpython
)
Ubuntu Mateは15,10以降、インジケーターをサポートしているため、インジケーターの作成とMateのパネルアプリの作成に大きな違いはありません。したがって、このリンクはpython
、AppIndicator3
API を使用するの基本的なインジケーターの出発点として適しています。リンクは良いスタートですが、インジケーターにテキストを表示する方法に関する情報は提供されません。テキスト(またはアイコン)を更新する方法は言うまでもありません。それにもかかわらず、いくつかの追加により、これは以下のようなインジケーターの基本的な「フレーム」につながります。アイコン、テキストラベル、メニューが表示されます。
#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3
class Indicator():
def __init__(self):
self.app = 'test123'
iconpath = "/opt/abouttime/icon/indicator_icon.png"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.indicator.set_label("1 Monkey", self.app)
def create_menu(self):
menu = Gtk.Menu()
# menu item 1
item_1 = Gtk.MenuItem('Menu item')
# item_about.connect('activate', self.about)
menu.append(item_1)
# separator
menu_sep = Gtk.SeparatorMenuItem()
menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
menu.append(item_quit)
menu.show_all()
return menu
def stop(self, source):
Gtk.main_quit()
Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
行AppIndicator3.IndicatorCategory.OTHER
では、この(部分的に古い)リンクで説明されているように、カテゴリが定義されています。適切なカテゴリを設定することは重要です。インジケーターをパネルの適切な位置に配置するためです。
本当の課題は、基本的なインジケーターをどのように書くかではなく、インジケーターのテキストやアイコンを定期的に更新する方法です。インジケーターを適切に機能させるために、threading
2番目のプロセスを開始して、定期的にインターフェイスを更新するだけでは使用できません。ええと、実際には可能ですが、長い目で見ると、競合が発生することがわかりました。
これがこの(古くなった)リンクにGObject
置かれているので、ここに来ます:
gobject.threads_init()
アプリケーションの初期化時に呼び出します。次に、通常どおりスレッドを起動しますが、スレッドがGUIタスクを直接実行しないようにしてください。代わりgobject.idle_add
に、メインスレッドで実行されるようにGUIタスクをスケジュールするために使用します
gobject.threads_init()
by GObject.threads_init()
とgobject.idle_add
by を置き換えるとGObject.idle_add()
、ほとんどの場合、Gtk
アプリケーションでスレッドを実行する方法の更新版が作成されます。サルの数が増加していることを示す簡単な例:
#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
class Indicator():
def __init__(self):
self.app = 'test123'
iconpath = "/opt/abouttime/icon/indicator_icon.png"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.indicator.set_label("1 Monkey", self.app)
# the thread:
self.update = Thread(target=self.show_seconds)
# daemonize the thread to make the indicator stopable
self.update.setDaemon(True)
self.update.start()
def create_menu(self):
menu = Gtk.Menu()
# menu item 1
item_1 = Gtk.MenuItem('Menu item')
# item_about.connect('activate', self.about)
menu.append(item_1)
# separator
menu_sep = Gtk.SeparatorMenuItem()
menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
menu.append(item_quit)
menu.show_all()
return menu
def show_seconds(self):
t = 2
while True:
time.sleep(1)
mention = str(t)+" Monkeys"
# apply the interface update using GObject.idle_add()
GObject.idle_add(
self.indicator.set_label,
mention, self.app,
priority=GObject.PRIORITY_DEFAULT
)
t += 1
def stop(self, source):
Gtk.main_quit()
Indicator()
# this is where we call GObject.threads_init()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
それが原則です。この回答の実際のインジケーターでは、ループ時間とインジケーターテキストの両方が、スクリプトにインポートされたセカンダリモジュールによって決定されましたが、主な考え方は同じです。