Pergunta

Eu estou tentando usar os widgets de contêineres personalizados em arquivos de definição gtk.Builder. Tanto quanto instanciar esses widgets, ele funciona muito bem:

#!/usr/bin/env python

import sys 
import gtk 

class MyDialog(gtk.Dialog):
    __gtype_name__ = "MyDialog"


if __name__ == "__main__":
    builder = gtk.Builder()
    builder.add_from_file("mydialog.glade")

    dialog = builder.get_object("mydialog-instance")
    dialog.run()

Agora, a questão é que dizer que tenho um gtk.TreeView Widget dentro daquele diálogo. Eu estou tentando descobrir como ligar esse widget para uma variável de instância MyDialog.

Uma alternativa barata que posso pensar é chamar método adicional depois de obter o diálogo Widget assim:

dialog = builder.get_object("mydialog-instance")
dialog.bind_widgets(builder)

Mas isso parece bastante estranho. Alguém resolveu este já ou tem uma idéia melhor de como vai fazer sobre isso?

Obrigado,

Foi útil?

Solução

Tudo bem, eu acho que eu respondi minha própria pergunta.

Uma maneira de fazer o acima é para substituir parser_finished de gtk.Buildable (), que dá acesso ao objeto construtor que criou a instância de classe em si. O método é chamado depois de todo o arquivo .xml foi carregado, por isso todos os widgets adicionais que pode querer se apossar de já estão presentes e intialized:

class MyDialog(gtk.Dialog, gtk.Buildable):
    __gtype_name__ = "MyDialog"

    def do_parser_finished(self, builder):
        self.treeview = builder.get_object("treeview1")
        # Do any other associated post-initialization

Uma coisa a notar é que, por alguma razão (pelo menos para mim, em pygtk 2,12), se eu não explicitamente herdar de gtk.Buildable, o método de substituição não são chamados, até pensei gtk.Dialog já implementa a interface edificável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top