web-dev-qa-db-ja.com

Pythonを使用したアプリインジケーターでのGtk.Widgetsの使用

2010年、Stefano Palazzoは関連する質問 任意のgtk.Widgetをappindicator.Indicatorに入れる を求め、同様の質問が StackOverflow で求められました。どちらの場合でも、Ubuntuのアプリインジケーターは限られているというコンセンサスです。マイケル・エクスストランドが言ったように:

アプリケーションインジケータメニューのサポートは、サポートする内容が制限されているD-Busメニューに基づいています-基本的なメニュー機能のみをサポートし、任意のウィジェットなどのよりエキゾチックなものはサポートしません。

ただし、2016年の今日のBluetoothインジケーターの表示とは矛盾しています。トグルスイッチを使用しています。

enter image description here

13.04のUbuntu Oneインジケーターでも同じことが観察できます。

enter image description here

したがって、明らかに方法があります。私はインディケータのBluetoothソースコードを勉強しましたが、それはValaで書かれています。ただし、私は主にpythonで作業します。既存のすべてのインジケーターを書き換えるだけでValaを学習するのは少し大変です。

質問の核心:Gtk.Widgetsをどのように使用できますか、または少なくともPythonを使用して、Bluetoothインジケーターのようなトグルスイッチを使用できますか?

NOTE:実例を提供する回答に報いるために、この質問に報奨金を払いたいと思っています pythonで。他の言語は受け入れられません。

44

この問題は、AppIndicatorsがインジケーターメニューを簡単に作成できる一方で、それらを作成する邪魔になるために存在します。 AppIndicatorを使用したサンプルpythonコードと、BluetoothコードのようにGLibメニューを使用したコードの違いを見てみましょう。

最初に、gtk.Menuを作成するように指示されます。これらは、現在廃止されているGtk.Actionを使用する古いスタイルのGtkメニューオブジェクトです。 AppIndicatorは、set_menu(...)プロセス中にgtk.Menuオブジェクトを取得して解析し、検出した各メニューをlibdbusmenuを使用して作成されたインジケーターサービスにプッシュします。この解析プロセスにより、AppIndicatorでサポートされていないものは何を行っても除外されます。

次に、Bluetoothメニューを見てみましょう。これはGio.Menuオブジェクトを使用して作成され、これらはGActionシステムを使用する新しいスタイルのGnomeメニューです。次に、AppIndicatorまたはlibdbusmenuを使用せずに独自のサービスを登録し、カスタムx-canonical-typeプロパティを使用してセットアップし、解析のためにlibidoに渡されるスイッチウィジェットを作成します。

すべてのCanonical独自のUnityカスタマイズであるため、この演習全体はかなり悪いです。したがって、団結が始まるとすぐに、指示者はいません。