Utilizzo di Gtk.Widgets negli indicatori delle app con Python


44

Nel 2010 Stefano Palazzo ha posto una domanda correlata, inserendo un gtk.Widget arbitrario in un appindicator.Indicator , e uno simile è stato posto su StackOverflow . In entrambi i casi il consenso è che gli indicatori delle app di Ubuntu sono limitati. Come diceva Michael Ekstrand:

Il supporto del menu Indicatore applicazione si basa sui menu D-Bus, che sono limitati in ciò che supportano: supportano solo funzionalità di menu di base, non cose più esotiche come widget arbitrari.

Tuttavia, contraddice ciò che vediamo oggi nell'indicatore Bluetooth, nel 2016: utilizza interruttori a levetta.

inserisci qui la descrizione dell'immagine

Lo stesso si può osservare con l'indicatore Ubuntu One del 13.04:

inserisci qui la descrizione dell'immagine

Quindi ovviamente c'è un modo. Ho studiato il codice sorgente indicatore-bluetooth, ma è scritto in Vala. Tuttavia, lavoro principalmente in Python e imparare Vala solo per riscrivere tutti i miei indicatori già esistenti è un po 'troppo lavoro.

Quindi il nocciolo della domanda: come si può usare Gtk.Widgets o come minimo un interruttore a levetta proprio come nell'indicatore Bluetooth, usando Python?

NOTA : Sono disposto a dare generosità a questa domanda per premiare una risposta che fornirà un esempio funzionante in Python . Altre lingue non sono accettate


6
L'indicatore dell'applicazione è limitato anche se non supporta l'icona al volo (carica semplicemente il file immagine dal filesystem). Quegli indicatori che hai citato sono indicatori di SISTEMA (bluetooth, ubuntu one, suono, potenza, ...). Sono diversi e non usano libappindicator. Ho già pubblicato alcuni post che possono aiutare a chiarire la differenza. Ho già un indicatore di sistema che funziona usando C. ma in Python sto ancora lottando.
user.dz,

2
C'è un modo per attirare l'attenzione dei principali sviluppatori di Ubuntu su questa domanda?
don.joey,

1
Almeno test = Gtk.CheckMenuItem("Monkey")funziona aggiungendo un pulsante di spunta, ma dovrebbe essercene di più. Mentre quella opere, questo dovrebbe funzionare, ma non lo fa: Gtk.CheckMenuItemToggled("Monkey"). Sono abbastanza sicuro che possa funzionare comunque. Vedi: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm

1
@JacobVlijm sì, aggiungendo qualsiasi singolo menuitem funziona, funziona anche per aggiungere un Gtk.Box e aggiungere Gtk.Label a quella casella, ma nient'altro (dice che il widget può contenere solo un elemento.
Sergiy Kolodyazhnyy

1
Gtk.ImageMenuItemè deprecato e sconsigliato di usare btw: developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm,

Risposte:


1

Questo problema si verifica perché, sebbene gli AppIndicator semplificino la creazione di un menu di indicatori, impediscono di crearne uno. Diamo un'occhiata alle differenze tra il codice python di esempio usando AppIndicator e uno usando i menu GLib come fa il codice Bluetooth.

Innanzitutto ti viene chiesto di creare un gtk.Menu, questi sono oggetti di menu Gtk di vecchio stile che usano Gtk.Actionche ora sono deprecati. AppIndicator prende l' gtk.Menuoggetto da te durante il set_menu(...)processo e lo analizza, spingendo ciascuno dei menu che trova sul servizio indicatore creato usando libdbusmenu. Questo processo di analisi significa che tutto ciò che non è supportato da AppIndicator viene filtrato, indipendentemente da ciò che fai.

Ora diamo un'occhiata al menu Bluetooth. Creato usando Gio.Menuoggetti, si tratta di nuovi menu Gnome di stile che utilizzano il GActionsistema. Ha quindi registrato il proprio servizio senza utilizzare AppIndicatoro libdbusmenue impostare è utilizzando una x-canonical-typeproprietà personalizzata per creare il widget switch a cui viene passato libidoper l'analisi.

L'intero esercizio è piuttosto negativo, dal momento che sono tutte personalizzazioni Unity di Canonical. Quindi non appena l'unità va, non ci sono comunque appindicatori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.