問題のアプリケーションは何らかのアクション(ここではオーディオをネットワークストリームに接続します)を実行し、これらのアクションが成功した場合は最小化されて実行されます。したがって、接続の状態を表示するにはステータスアイコンが必要です(例:CONNECTED/DISCONNECTED)。アイコンをクリックした場合のみ、アプリケーションウィンドウが開き、他のオプションにアクセスできます。
Python 2.6とpyGtkを使用すると、gtk_status_iconを使用してこれを実現できました。さまざまなUbuntuバージョンを含め、できるだけ多くのディストリビューションで実行するようにアプリケーションを意図的に作成しました。ユーザーがそれらをインストールした後にのみ、可能な依存関係を使用するように注意しました。
しかし、gtk_status_iconは今後のUbuntuのリリースではサポートされなくなると聞いています。開発者は、代わりにアプリケーションインジケータを使用するよう求められます。次のことを確認するためのベストプラクティスは次のとおりです。
indicator-appletが実行されていない場合、gtk_status_iconへのアプリケーションインジケーターフォールバックメカニズムは機能しません。インポート元のappindicatorモジュールがない場合、Pythonインタープリターは実行されません。ディストリビューションごとに異なるバージョンを開発する必要がありますか、またはこれを回避するより良い方法はありますか?.
buntu Wiki で示されている例以外のApplicationIndicatorの使用方法に関するドキュメントはどこにありますか? Ubuntuと非Ubuntuディストリビューションの異なるソースコードのプログラミングを回避するために、インジケーターアプレットが実行されているかどうかを確認するためのコマンドは何ですか?
ここでの必要性は、実際にはpython-appindicatorライブラリーが存在するかどうかを判断することだと思います。存在する場合、必要なすべてのフォールバックケースをサポートします。 XFCE、KDE、および古いGNOMEを適切に処理します。 この回答でそれを行う方法の良い例 。
Appindicatorライブラリは、DBusを使用して、アプリケーションインジケーターのレンダリングプロセスが利用可能かどうかを確認します。これはUnityの場合、またはインジケーターアプレットが実行されている場合に当てはまります。利用可能な場合はそれを使用し、利用できない場合は同じメニューでGtkStatusIconを使用するようにフォールバックします。
残念ながら、ライブラリが利用できない場合を処理する場合は、両方のコードパスを保持する必要があると思います。しかし、私たちは他のディストリビューションでライブラリを取得するのを手伝いたいです:)
StackApplet でうまく機能する優れたソリューションがあります-実際にモジュールが存在しない場合に内部でgtk.StatusIcon
を使用して同一の機能を提供するappindicator
モジュールの機能的に同等なバージョンを作成しました。
それを使用するのは簡単です:
appindicator_replacement.py
と呼びますアプリケーションに次を追加します。
try:
import appindicator
except ImportError:
import appindicator_replacement as appindicator
それだけです!これで、アプリケーションはAppIndicatorsのサポートの有無にかかわらず完全に実行されます。他のプラットフォーム固有のコードがない場合は、Windows上でも実行されます。
注:ファイルはMITライセンスの下でリリースされます-そのため、ほとんどすべてに使用できます。
両方のコードを記述する必要があります。次のようなコードを使用して、Pythonコード内のappindicatorの存在を検出できます。
have_appindicator = True
try:
import appindicator
except:
have_appindicator = False
そこから、have_appindicatorを使用して、appindicatorコードを使用するかgtk_status_iconコードを使用するかを決定します。
残念ながら、これはまた、Ubuntuとテストする別の環境の両方が必要になることを意味します。
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を心配する必要はありません。これは当てはまりません。インジケーターアプレットは必須コンポーネントであり、既定で実行されるため、フォールバックシナリオはありません。