Mettere un gtk.Widget arbitrario in un appindicator.Indicator


18

Mettere qualsiasi gtk.Widget all'interno di un gtk.Menu funziona, in qualche modo, inserendo prima un gtk.MenuItem vuoto. Non sembra essere affidabile, ma sostanzialmente funziona. Con un appindicator.Indicator, non funziona. La voce rimane vuota. Anche se imposti il ​​child [border_size] su 32, per esempio.

L'unico widget che funziona è gtk.Label (oltre a MenuItem, ImageMenuItem e così via ovviamente).

Ora il menu Me ha un gtk. Entra in esso, quindi deve sicuramente essere possibile farlo correttamente. Come lo faccio?

Ecco alcuni esempi di codice per spiegare di cosa mi occupo:

    self.item = gtk.MenuItem()
    self.item.add(gtk.Label("hello world!"))
    self.menu.append(self.item)

Il codice sopra funziona, ma questo non funziona:

    self.item = gtk.MenuItem()
    self.item.add(gtk.Entry())
    self.menu.append(self.item)

Dove self.menu è un appindicator.Indicator, se fosse un gtk.Menu, la voce sarebbe almeno visualizzata.

Ecco un po 'di codice funzionante:

import gtk
import appindicator

class AppIndicator (object):

    def __init__(self):
        self.ind = appindicator.Indicator("hello world client",
            "distributor-logo", appindicator.CATEGORY_APPLICATION_STATUS)
        self.ind.set_status (appindicator.STATUS_ACTIVE)
        self.menu = gtk.Menu()
        item = gtk.MenuItem()

        item.add(gtk.Label("hello world"))
        # item.add(gtk.Entry())

        self.menu.append(item)
        self.menu.show_all()
        self.ind.set_menu(self.menu)


indicator = AppIndicator()
gtk.main()

Come mi ha ricordato @MarcoCeppi, sì - questo non dovrebbe funzionare. Sto solo sperando e sognando, forse può. Dal momento che il menu Me fa qualcosa di apparentemente simile.
Stefano Palazzo

1
Sono abbastanza sicuro che il menu Me faccia uso della libido (Indicator Display Objects) per farlo. Vedi: launchpad.net/ido In particolare, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/… ). Sfortunatamente, non penso che ci siano attacchi in pitone. Potresti voler chiedere nell'elenco e-mail di ayatana-dev.
Andrewsomething

Hai scoperto come farlo? Sono di fronte allo stesso problema. Grazie.
Benjamin,

Risposte:


7

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.

Un ostacolo significativo per loro che supportano mai tali cose è il fatto che il menu degli indicatori dell'applicazione è reso da un processo diverso, il processo dell'indicatore dell'applicazione, quindi il tuo programma non ha accesso a disegnare direttamente su di esso. Il superamento di questo richiederebbe o supportare qualcosa come X-Embed nei menu D-Bus o consentire a tutta GTK di funzionare su D-Bus.


2

L'indicatore audio in Ubuntu ha cursori per il volume e mi chiedevo come fosse possibile. Dopo aver dato un'occhiata al codice sembra che ci siano GtkMenus che possono essere compilati tramite dbus nel frattempo: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Ma non so come usarli. Volevo scrivere un indicatore sonoro in cui posso controllare il volume per-app proprio come può farlo Pavucontrol.

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.