Bagaimana cara memprogram ikon status yang akan ditampilkan di Ubuntu dan juga di distribusi lainnya?

23

Aplikasi yang dimaksud melakukan beberapa tindakan (di sini menghubungkan audio ke aliran jaringan) dan berjalan diminimalkan jika tindakan ini berhasil. Oleh karena itu diperlukan ikon status untuk menampilkan status koneksi (mis. TERHUBUNG / TERPUTUS). Hanya ketika mengklik ikon, jendela aplikasi akan terbuka untuk memberikan akses ke opsi lebih lanjut.

Menggunakan Python 2.6 dan pyGtk saya dengan mudah menyadari hal ini dengan menggunakan gtk_status_icon . Saya sengaja menulis aplikasi untuk berjalan di sebanyak mungkin distribusi termasuk berbagai versi Ubuntu. Saya berhati-hati untuk menggunakan dependensi yang mungkin hanya setelah pengguna menginstalnya.

Namun sekarang saya mendengar bahwa gtk_status_icon tidak lagi didukung dalam rilis Ubuntu yang akan datang. Pengembang diminta untuk menggunakan Indikator Aplikasi sebagai gantinya. Apa yang kemudian menjadi praktik terbaik untuk memastikan bahwa:

  1. Ikon lokal aplikasi ditampilkan dengan benar
  2. Aplikasi ini masih akan berjalan dan menampilkan ikonnya di rilis Ubuntu yang akan datang.
  3. Aplikasi ini juga akan berjalan dan menampilkan ikon-ikonnya di lingkungan lain di mana indikator-applet , libappindicator , dan python-appindicator tidak disediakan.

Mekanisme fallback Indikator Aplikasi ke gtk_status_icon tidak akan berfungsi jika indikator-applet tidak berjalan. Penerjemah python tidak akan berjalan jika tidak ada modul appindicator untuk diimpor. Apakah saya perlu mengembangkan versi yang berbeda untuk distribusi yang berbeda atau apakah ada cara yang lebih baik untuk mengatasi ini.

Di mana saya menemukan dokumentasi tentang cara menggunakan ApplicationIndicator selain dari contoh yang diberikan di Wiki Ubuntu ? Perintah apa yang disediakan untuk memeriksa apakah applet indikator berjalan untuk menghindari pemrograman kode sumber yang berbeda untuk distribusi Ubuntu vs non-Ubuntu?

Takkat
sumber

Jawaban:

16

Saya pikir kebutuhan di sini sebenarnya lebih menentukan perpustakaan python-appindicator hadir. Jika ada, itu akan mendukung semua kasus mundur yang Anda butuhkan. Ini akan menangani XFCE, KDE dan GNOME yang lebih lama dengan tepat. Contoh bagus bagaimana melakukannya dalam jawaban ini .

Pustaka appindicator akan menggunakan DBus untuk memeriksa apakah proses pemberian indikator aplikasi tersedia. Ini akan menjadi kasus di Unity, atau jika applet indikator berjalan. Jika tersedia itu akan menggunakannya, jika tidak, itu akan mundur untuk menggunakan GtkStatusIcon dengan menu yang sama.

Sayangnya, saya yakin Anda harus tetap menggunakan kedua jalur kode jika Anda ingin menangani kasus perpustakaan yang tidak tersedia. Meskipun demikian, kami dengan senang hati membantu mendapatkan perpustakaan di distro lain :)

Ted Gould
sumber
Terima kasih atas jawaban yang sangat jelas ini. Ini menunjuk ke jalur yang harus saya kunjungi jika saya ingin aplikasi saya berjalan di 11.04. Saya memang memiliki jalur kerja untuk GtkStatusIcon tetapi perlu mengembangkan semuanya lagi untuk indikator-applet. Jika saya memahami komentar Anda untuk bug # 668375 saya mungkin dapat menggunakan ikon lokal saya tanpa harus membuat tema ikon keseluruhan, bukan?
Takkat
Setelah memiliki waktu untuk mempelajari pemrograman AppIndicator, saya menemukan bahwa menggunakan saran jgoguen untuk memeriksa modul appindicator tidak benar-benar membantu, karena Ikon khusus tidak akan ditampilkan dalam 10,04 LTS. Lihat komentar saya untuk bug # 668375.
Takkat
Jawaban saya termasuk cara yang sangat mudah untuk menyelesaikan masalah ini. Ini bekerja sangat baik untuk aplikasi saya dan bahkan membuatnya tidak menyakitkan untuk mem-port aplikasi yang menggunakan AppIndicators ke Windows!
Nathan Osman
10

Saya memiliki solusi luar biasa yang telah bekerja dengan baik di StackApplet - Saya membuat versi appindicatormodul yang setara secara fungsional yang menggunakan gtk.StatusIconinternal untuk menyediakan fungsionalitas yang identik ketika modul sebenarnya tidak ada.

Menggunakannya sesederhana:

  1. Mengunduh file berikut dan menyebutnyaappindicator_replacement.py
  2. Menambahkan yang berikut ke aplikasi Anda:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

Itu dia! Sekarang aplikasi Anda akan berjalan dengan sempurna dengan atau tanpa dukungan untuk AppIndicators. Itu bahkan akan berjalan pada Windows, dengan asumsi Anda tidak memiliki kode spesifik platform lainnya.


Catatan: file ini dirilis di bawah lisensi MIT - sehingga Anda dapat menggunakannya cukup banyak untuk apa pun.

Nathan Osman
sumber
9

Anda harus menulis kode untuk keduanya. Anda dapat mendeteksi keberadaan appindicator di kode Python Anda menggunakan sesuatu yang mirip dengan:

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

Dari sana, gunakan have_appindicator untuk memutuskan apakah Anda harus menggunakan kode appindicator atau kode gtk_status_icon.

Sayangnya, ini juga berarti Anda harus memiliki Ubuntu dan lingkungan lain untuk diuji.

jgoguen
sumber
1
Namun, mungkin ada lingkungan di mana python-appindicator diinstal tetapi applet indikator tidak berjalan. Aplikasi perlu menangani ini juga.
Takkat
Untuk itu, lihat wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Custom Fallbacks. Per default, Anda akan mendapatkan gtk.StatusIcon untuk indikator aplikasi jika tidak ada applet indikator.
htorque
Saya mengetahui opsi mundur. Yang tidak saya mengerti adalah, jika applet indikator tidak berjalan bagaimana bisa applet indikator memberikan fallback?
Takkat
Saya membayangkan bahwa itu hanya memeriksa applet indikator dan menyediakan fungsionalitas gtk_status_icon di belakang layar.
jgoguen
1
@ jgoguen: apa itu "it"? Saya mengerti bahwa mulai 11.04 Ubuntu / Unity tidak lagi mendukung gtk_status_icon. Distribusi lain mungkin tidak memiliki "itu". Saya sangat khawatir tentang ini.
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 )

Dengan cara ini Anda dapat mendeteksi apakah applet indikator berjalan. Anda tidak perlu khawatir tentang Ubuntu 11.04 karena ini tidak akan terjadi. Tidak ada skenario fallback karena indikator-applet adalah komponen wajib, berjalan secara default.

OpenNingia
sumber
Terima kasih atas penunjukan Anda untuk mendapatkan PID indikator-applet (Saya sudah melakukan ini untuk kemungkinan dependensi lainnya dengan menggunakan pidof), ini akan menjadi cara yang kurang elegan jika tidak ada yang lebih baik tersedia. Sejauh yang saya bisa lihat indikator-applet berjalan andal hanya dengan satu jika persyaratan perangkat keras terpenuhi. Pengguna dapat boot ke GNOME 2D dan dapat memutuskan untuk tidak menjalankan applet indikator. Namun ini mungkin bukan masalah saya.
Takkat
Saya setuju dengan Anda bahwa itu mungkin tidak 'elegan' (tetapi Anda dapat menambahkan semua kosmetik yang Anda inginkan: D) namun itu harus bekerja. Secara pribadi saya lebih suka solusi yang bekerja dengan baik dan keanggunan menempati urutan kedua :)
OpenNingia
Tugas ini sepertinya tidak berjalan di sistem 14.04 saya. Apakah pendekatannya telah diatasi? /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-serviceSebagai gantinya, ada banyak tugas.
halfer