Jak zaprogramować ikonę stanu, która będzie wyświetlana w Ubuntu, a także w innych dystrybucjach?

23

Aplikacja, o której mowa, wykonuje pewne działania (w tym przypadku podłącza audio do strumieni sieciowych) i działa zminimalizowana, jeśli działania te zakończyły się powodzeniem. Dlatego ikona stanu jest potrzebna do wyświetlenia stanu połączenia (np. POŁĄCZONY / ROZŁĄCZONY). Tylko po kliknięciu ikony otworzy się okno aplikacji, aby uzyskać dostęp do dalszych opcji.

Za pomocą Pythona 2.6 i pyGtk dogodnie to zrealizowałem, używając gtk_status_icon . Celowo napisałem aplikację, aby działała na jak największej liczbie dystrybucji, w tym różnych wersjach Ubuntu. Zadbałem o wykorzystanie możliwych zależności dopiero po ich zainstalowaniu przez użytkownika.

Jednak teraz słyszę, że gtk_status_icon nie będzie już obsługiwany w przyszłych wersjach Ubuntu. Programiści są proszeni o stosowanie zamiast tego wskaźników aplikacji. Jaka jest zatem najlepsza praktyka, aby upewnić się, że:

  1. Lokalne ikony aplikacji są wyświetlane poprawnie
  2. Aplikacja będzie nadal działać i wyświetlać jej ikony w przyszłych wydaniach Ubuntu.
  3. Aplikacja będzie również działać i wyświetlać swoje ikony w innych środowiskach, w których aplet wskaźnikowy , libappindicator i python-appindicator nie są dostarczane.

Mechanizmy awaryjne wskaźnika aplikacji do gtk_status_icon nie będą działać, jeśli aplet wskaźnika nie jest uruchomiony. Interpretatory języka Python nie będą działać, jeśli nie będzie modułu do importowania z appindicator . Czy muszę opracowywać różne wersje dla różnych dystrybucji, czy jest lepszy sposób na obejście tego?

Gdzie znajdę dokumentację na temat używania ApplicationIndicator inną niż w przykładzie podanym w Ubuntu Wiki ? Jakie komendy służą do sprawdzania, czy aplet wskaźnika działa, aby uniknąć programowania różnych kodów źródłowych dla dystrybucji Ubuntu w porównaniu do dystrybucji innych niż Ubuntu?

Takkat
źródło

Odpowiedzi:

16

Myślę, że potrzebą tutaj jest właściwie bardziej determinacja biblioteki python-appindicator. Jeśli jest obecny, będzie obsługiwał wszystkie potrzebne sprawy awaryjne. Będzie odpowiednio obsługiwał XFCE, KDE i starszy GNOME. Dobry przykład tego, jak to zrobić w tej odpowiedzi .

Biblioteka appindicator użyje DBus do sprawdzenia, czy proces renderowania wskaźnika aplikacji jest dostępny. Tak będzie w przypadku Unity lub jeśli aplet wskaźnika jest uruchomiony. Jeśli jest dostępny, użyje go, jeśli nie, wróci do korzystania z GtkStatusIcon z tym samym menu.

Niestety uważam, że musisz zachować obie ścieżki kodu, jeśli chcesz poradzić sobie z przypadkiem braku dostępności biblioteki. Z chęcią pomożemy uzyskać bibliotekę w innych dystrybucjach :)

Ted Gould
źródło
Dziękuję za tę bardzo jasną odpowiedź. To wskazuje ścieżkę, którą muszę przejść, jeśli chcę, aby moja aplikacja działała w 11.04. Mam ścieżkę działania dla GtkStatusIcon, ale będę musiał ponownie opracować całość dla apletu wskaźnika. Jeśli zrozumiałem twój komentarz do błędu # 668375, mogę ewentualnie użyć lokalnych ikon bez konieczności tworzenia całego motywu ikony, czy mogę?
Takkat
Mając czas na zanurzenie się w programowaniu AppIndicator, odkryłem, że użycie sugestii jgoguen do sprawdzenia modułu appindicator tak naprawdę nie pomaga, ponieważ niestandardowe ikony nie będą renderowane w 10.04 LTS. Zobacz moje komentarze do błędu # 668375.
Takkat
Moja odpowiedź zawiera bardzo łatwy sposób rozwiązania tego problemu. Działa bardzo dobrze w przypadku mojej aplikacji, a nawet sprawiło, że bezbolesne stało się przeniesienie aplikacji korzystającej z AppIndicators do systemu Windows!
Nathan Osman
10

Mam doskonałe rozwiązanie, które sprawdziło się w StackApplet - stworzyłem funkcjonalnie równoważną wersję appindicatormodułu, która używa gtk.StatusIconwewnętrznie do zapewnienia identycznej funkcjonalności, gdy prawdziwy moduł nie istnieje.

Korzystanie z niego jest tak proste, jak:

  1. Pobranie następującego pliku i wywołanie goappindicator_replacement.py
  2. Dodanie do aplikacji następujących elementów:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

To jest to! Teraz Twoja aplikacja będzie działała idealnie z obsługą AppIndicators lub bez niej. Działa nawet w systemie Windows, zakładając, że nie masz żadnego kodu specyficznego dla platformy.


Uwaga: plik jest wydany na licencji MIT - więc możesz go używać praktycznie do wszystkiego.

Nathan Osman
źródło
9

Będziesz musiał napisać kod dla obu. Możesz wykryć obecność appindicatora w kodzie Pythona, używając czegoś podobnego do:

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

Następnie użyj have_appindicator, aby zdecydować, czy powinieneś użyć kodu appindicator czy kodu gtk_status_icon.

Niestety oznacza to również, że będziesz musiał mieć zarówno Ubuntu, jak i inne środowisko do testowania.

jgoguen
źródło
1
Mimo to mogą istnieć środowiska, w których zainstalowany jest Python-appindicator, ale aplet wskaźnika nie jest uruchomiony. Aplikacja również musiałaby sobie z tym poradzić.
Takkat
W takim przypadku zobacz wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Niestandardowe awarie . Domyślnie otrzymasz wskaźnik gtk.StatusIcon dla wskaźnika aplikacji, jeśli nie ma apletu wskaźnika.
htorque
Mam świadomość opcji awaryjnej. Nie rozumiem, że jeśli aplet wskaźnika nie działa, w jaki sposób aplet wskaźnika może zapewnić awarię?
Takkat
Wyobrażam sobie, że po prostu sprawdza aplet wskaźnika i zapewnia funkcjonalność gtk_status_icon za kulisami.
jgoguen
1
@jgoguen: co to jest „it”? Rozumiem, że od 11.04 Ubuntu / Unity nie będzie już obsługiwał gtk_status_icon. Inne dystrybucje mogą nie mieć „go”. Naprawdę się tym martwię.
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 )

W ten sposób możesz wykryć, czy aplet wskaźnika jest uruchomiony. Nie musisz się martwić o Ubuntu 11.04, ponieważ tak nie będzie. Nie ma scenariusza awaryjnego, ponieważ aplet wskaźnika jest obowiązkowym składnikiem, domyślnie działającym.

OpenNingia
źródło
Dziękujemy za wskazanie PID wskaźnika-apletu (robię to już dla innych możliwych zależności za pomocą pidof), byłby to wprawdzie mniej elegancki sposób, gdyby nic lepszego nie było dostępne. O ile widzę, aplet wskaźnika działa niezawodnie z jednością tylko wtedy, gdy spełnione są wymagania sprzętowe. Użytkownicy będą mogli uruchamiać się w 2D GNOME i mogą zdecydować, aby nie uruchamiać apletu wskaźnika. Jednak może to nie wynikać z mojego problemu.
Takkat
Zgadzam się z tobą, że to może nie być „eleganckie” (ale możesz dodać cały kosmetyk, jaki chcesz: D), ale powinno działać. Osobiście wolę rozwiązania, które działają dobrze, a elegancja jest na drugim miejscu :)
OpenNingia
To zadanie nie działa na moim systemie 14.04. Czy podejście zostało zastąpione? /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-serviceZamiast tego jest wiele zadań.
halfer