Usando .add () no mesmo widget mais de uma vez

1

Eu fiz essa pergunta no Reddit e fui direcionado aqui. link

Infelizmente, estou tendo o mesmo problema e os problemas parecem que você só pode usar .add () em um widget uma vez. Então aqui está o meu código,

self.ui.labels = []
for titles in entries:
    label = Gtk.Label()
    self.ui.labels.append(label)         
    self.ui.viewport1.add(self.ui.labels[-1])
self.ui.paned1.show_all()

Agora, por diversão, decidi "O que aconteceria se eu fizesse manualmente ..."

self.ui.viewport1.add(Gtk.Label())
self.ui.viewport1.add(Gtk.Button())
self.ui.viewport1.add(Gtk.Entry())

Para o meu primeiro snippet de código, recebo este erro

Gtk-CRITICAL **: gtk_viewport_add: assertion gtk_bin_get_child (bin) == NULL' failed

O erro ocorre uma quantidade desconhecida de vezes porque as entradas da lista podem variar em tamanho, mas para o segundo trecho de código isso acontece exatamente duas vezes. Isso significa que quando eu viewport1.add () funciona na primeira vez, mas todos os adds depois recebem o erro acima.

Então, minha pergunta, existe uma maneira em Python de usar o .add () no mesmo widget mais de uma vez?

    
por Dillon Gilmore 23.06.2012 / 23:03

1 resposta

1

O Gtk tem diferentes tipos de contêineres. No momento, você está trabalhando com um contêiner GtkBin , que é um tipo de contêiner que suporta apenas um único criança. Você precisa de um contêiner que suporte mais de um filho. Para fazer isso, basta criar um container de sua escolha e adicioná-lo à viewport (como um widget comum). Existem algumas opções aqui, e elas estão listadas na documentação Gtk sobre contêineres .

Uma maneira de fazer isso é com um GtkBox :

self.ui.labels = []
for titles in entries:
    label = Gtk.Label()
    self.ui.labels.append(label)         
    self.ui.viewport1.add(self.ui.labels[-1])
self.ui.paned1.show_all()

# First, we need to create a box to hold all our widgets
box = Gtk.Box()
box.set_orientation(Gtk.Orientation.VERTICAL)

# Now add our widgets to the box, one by one, from the bottom
box.add(Gtk.Label())
box.add(Gtk.Button())
box.add(Gtk.Entry())

# We need to add the box to the viewport
self.ui.viewport.add(box)

box.show_all()

Depois de pegar o jeito, você pode querer jogar com alguma outra funcionalidade. Em vez de adicionar widgets cegamente à caixa, as funções pack_start e pack_end para o GtkBox dão a você o controle de cada widget adicionado. Você pode definir se uma criança recebe todo o espaço disponível e quanto espaço colocar em volta dela. Em alguns casos, você pode estar interessado em GtkGrid , que é um contêiner mais poderoso que suporta várias linhas e colunas .

    
por Dylan McCall 23.06.2012 / 23:28