Ubuntuや他のディストリビューションで表示されるステータスアイコンをプログラムする方法は?


23

問題のアプリケーションは何らかのアクション(ここではオーディオをネットワークストリームに接続します)を実行し、これらのアクションが成功した場合は最小化されて実行されます。したがって、接続の状態(CONNECTED / DISCONNECTEDなど)を表示するには、ステータスアイコンが必要です。アイコンをクリックした場合のみ、アプリケーションウィンドウが開き、他のオプションにアクセスできます。

Python 2.6とpyGtkを使用して、gtk_status_iconを使用することでこれを便利に実現しました。さまざまなUbuntuバージョンを含め、できるだけ多くのディストリビューションで実行するようにアプリケーションを意図的に作成しました。ユーザーがそれらをインストールした後にのみ、可能な依存関係を使用するように注意しました。

しかし、gtk_status_iconは今後のUbuntuのリリースではサポートされなくなると聞いています。開発者は、代わりにアプリケーションインジケータを使用するよう求められます。次のことを確認するためのベストプラクティスは次のとおりです。

  1. アプリケーションのローカルアイコンが適切に表示される
  2. アプリケーションは引き続き実行され、今後のUbuntuリリースでアイコンが表示されます。
  3. アプリケーションがしますまた、実行したり、他の環境でのアイコンを表示するインジケータアプレットlibappindicator、およびPythonは、appindicator提供されていません。

インジケーターアプレットが実行されていない場合、gtk_status_iconへのアプリケーションインジケーターフォールバックメカニズムは機能しません。インポートするappindicatorモジュールがない場合、Pythonインタープリターは実行されません。ディストリビューションごとに異なるバージョンを開発する必要がありますか、またはこれを回避するより良い方法はありますか?

Ubuntu Wikiに記載されている例以外のApplicationIndicatorの使用方法に関するドキュメントはどこにありますか?Ubuntuと非Ubuntuディストリビューションの異なるソースコードのプログラミングを回避するために、インジケーターアプレットが実行されているかどうかを確認するためのコマンドは何ですか?

回答:


16

ここでの必要性は、実際にはpython-appindicatorライブラリが存在するかどうかを判断することだと思います。存在する場合、必要なすべてのフォールバックケースをサポートします。XFCE、KDE、および古いGNOMEを適切に処理します。 この答えでそれを行う方法の良い例

appindicatorライブラリはDBusを使用して、アプリケーションインジケーターのレンダリングプロセスが利用可能かどうかを確認します。これはUnityの場合、またはインジケーターアプレットが実行されている場合に当てはまります。使用可能な場合はそれを使用し、使用できない場合は、同じメニューでGtkStatusIconを使用するようにフォールバックします。

残念ながら、ライブラリが利用できない場合を処理する場合は、両方のコードパスを保持する必要があると思います。しかし、私たちは他のディストリビューションでライブラリを取得するのを手伝いたいです:)


この非常に明確な答えをありがとう。これは、11.04でアプリを実行する場合に行かなければならないパスを示しています。GtkStatusIconの作業パスはありますが、インジケーターアプレット用にすべてを再度開発する必要があります。バグ#668375へのコメントを理解した場合、アイコンテーマ全体を作成せずにローカルアイコンを使用できますか?
Takkat

AppIndicatorプログラミングに飛び込む時間があったので、jgoguenの提案を使用してappindicatorモジュールを確認しても、カスタムアイコンは10.04 LTSではレンダリングされないため、実際には役立ちません。バグ#668375への私のコメントを参照してください。
Takkat

私の答えには、この問題を解決する非常に簡単な方法が含まれています。私のアプリでは非常にうまく機能し、AppIndicatorsを使用するアプリをWindowsに移植することさえ簡単になりました!
ネイサンオスマン

10

StackAppletでうまく機能する優れたソリューションがあります。実際のモジュールが存在しない場合に同じ機能を提供するために内部的にappindicator使用するモジュールの機能的に同等なバージョンを作成しましたgtk.StatusIcon

それを使用するのは簡単です:

  1. 次のファイルをダウンロードして呼び出すappindicator_replacement.py
  2. アプリケーションに次を追加します。

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

それでおしまい!これで、アプリケーションはAppIndicatorsのサポートの有無にかかわらず完全に実行されます。他のプラットフォーム固有のコードがない場合は、Windows上でも実行されます。


注:このファイルはMITライセンスの下でリリースされているため、ほとんどすべての用途に使用できます。


9

両方のコードを記述する必要があります。Pythonコード内のappindicatorの存在は、次のようなものを使用して検出できます。

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

そこから、have_appindicatorを使用して、appindicatorコードを使用するかgtk_status_iconコードを使用するかを決定します。

残念ながら、これはまた、Ubuntuとテストする別の環境の両方が必要になることを意味します。


1
それでも、python-appindicatorはインストールされているが、インジケーターアプレットが実行されていない環境が存在する場合があります。アプリケーションもこれを処理する必要があります。
Takkat

その場合は、wiki.ubuntu.com / DesktopExperienceTeam / ApplicationIndicators > Custom Fallbacksをご覧ください。デフォルトでは、インジケータアプレットが存在しない場合、アプリケーションインジケータのgtk.StatusIconを取得します。
htorque

フォールバックオプションを認識しています。インジケーターアプレットが実行されていない場合、インジケーターアプレットがフォールバックを提供する方法はわかりません。
Takkat

私はそれが単にインジケータアプレットをチェックし、舞台裏でgtk_status_icon機能を提供することを想像します。
jgoguen

1
@jgoguen:「それ」とは何ですか?11.04以降、Ubuntu / Unityはgtk_status_iconをサポートしなくなることを理解しています。他のディストリビューションには「it」がない場合があります。これが本当に心配です。
Takkat

3
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

これにより、インジケータアプレットが実行されているかどうかを検出できます。Ubuntu 11.04を心配する必要はありません。これは当てはまりません。インジケーターアプレットは必須コンポーネントであり、デフォルトで実行されるため、フォールバックシナリオはありません。


インジケーターアプレットのPIDを取得していただきありがとうございます(pidofを使用して他の可能な依存関係については既にこれを行っています)。私の知る限り、インジケータアプレットは、ハードウェア要件が満たされている場合にのみ、確実に単一で実行されます。ユーザーは2D GNOMEを起動でき、インジケーターアプレットを実行しないことを決定できます。しかし、これは私の問題ではないかもしれません。
Takkat

「エレガント」ではないかもしれないことに同意します(ただし、必要なすべての化粧品を追加できます:D)。個人的には、うまく機能し、優雅さが2番目に来るソリューションを好みます:)
OpenNingia

このタスクは、私の14.04システムで実行されていないようです。アプローチは取って代わられましたか?/usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-service代わりに多くのタスクがあります。
halfer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.