Colocando um gtk.Widget arbitrário em um appindicator.Indicator

18

Colocando qualquer gtk.Widget dentro de um gtk.Menu funciona um pouco, colocando um gtk.MenuItem vazio primeiro. Não parece ser confiável - mas basicamente funciona. Com um appindicator.Indicator, não funciona. A entrada apenas fica vazia. Mesmo se você definir o filho [border_size] para 32, por exemplo.

O único widget que funciona é um gtk.Label (além do MenuItem, ImageMenuItem e assim por diante, é claro).

Agora o menu Me tem um gtk.Entry nele, então certamente deve ser possível fazer isso corretamente. Como faço isso?

Veja alguns exemplos de código para explicar o que eu estou falando:

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

O código acima funciona, mas isso não funciona:

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

Onde self.menu é um appindicator.Indicator, se fosse um gtk.Menu, a entrada seria pelo menos exibida.

Aqui está um código de trabalho:

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()
    
por Stefano Palazzo 06.12.2010 / 15:25

2 respostas

7

O suporte do menu Indicador de Aplicação é baseado nos menus do D-Bus, que são limitados no que suportam - eles suportam apenas a funcionalidade básica do menu, não coisas mais exóticas, como widgets arbitrários.

Um obstáculo significativo para eles sempre apoiando tais coisas é o fato de que o menu indicador do aplicativo é processado por um processo diferente, o processo do indicador do aplicativo, para que seu programa não tenha acesso para desenhar qualquer coisa diretamente nele. Superar isso exigiria suporte a algo como o X-Embed nos menus do D-Bus ou permitir que todo o GTK trabalhasse com o D-Bus.

    
por Michael Ekstrand 06.12.2010 / 15:46
2

O indicador de som no Ubuntu tem controles deslizantes para o volume e fiquei imaginando como isso é possível. Depois de uma olhada no código, parece que existem GtkMenus que podem ser preenchidos via dbus enquanto isso: link

Mas não sei como usá-los. Queria escrever um indicador sonoro onde eu possa controlar o volume por aplicativo, assim como o pavucontrol pode fazer isso.

    
por c_korn 24.04.2016 / 02:15