GNU/Linux >> Linux の 問題 >  >> Ubuntu

動的に更新されるパネルアプリ/インジケーターを作成する方法は?

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

それが原則です。この回答の実際のインジケーターでは、ループ時間とインジケーターテキストの両方が、スクリプトにインポートされたセカンダリモジュールによって決定されましたが、主な考え方は同じです。


Ubuntu
  1. Sambaで書き込み権限を付与するにはどうすればよいですか?

  2. Gnome-control-centerパネル名を一覧表示する方法は?

  3. パネルにインジケーター-日時を追加する方法は?

  1. GNOMEShellでインジケーターアプレットを使用する方法

  2. UbuntuとDebianにインジケーターSysMonitorをインストールする方法

  3. Gnomeパネルを削除する方法は?

  1. Windows10にWSL2をインストールする方法(更新)

  2. Ubuntu20.04にReactJSをインストールする方法

  3. Ubuntu20.04にシグナルメッセージングアプリをインストールする方法