ubuntuMate用のパネルアプリをいくつか作成しようとしています。
C/ C ++とSDLをかなりよく知っています。
Mate-Universityパネルアプリのgithubページを見ましたが、動作しません。きちんと/私はそれでしばらく時間を過ごしています。
パネルアプリを作成する簡単な方法があるかどうか疑問に思っています。カスタムアプリケーションランチャーの使用について話しているのではなく、パネルに新しい機能を追加したいのですが、その方法がわかりません。チュートリアル、またはパネルアプリの作成に関する説明が非常に役立つ場合があります。
ベストアンサー
この質問をする機会はすでに答えがあるように思われるので、私はそれがどのように行われたかについての拡張説明としてこの質問に答えています(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 = "//eadn-wc01-5196795.nxedge.io/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()
を置き換える場合 GObject.threads_init()
による およびgobject.idle_add
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 = "//eadn-wc01-5196795.nxedge.io/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()
それが原則です。この回答の実際のインジケーターでは、ループ時間とインジケーターテキストの両方が、スクリプトにインポートされたセカンダリモジュールによって決定されましたが、主な考え方は同じです。