Como redimensionar dinamicamente as páginas do notebook GTK

5

Eu tenho um aplicativo Python que usa um widget Gtk.Notebook para exibir páginas diferentes. Cada uma dessas páginas contém um conjunto diferente de widgets, e notei que o widget 'mais alto' em termos de espaço vertical define o tamanho vertical geral do bloco de notas.

Mas, na verdade, gostaria que meu aplicativo redimensionasse as páginas para não desperdiçar espaço vertical e adaptar, ou seja, redimensionar para o mesmo tamanho vertical que o widget que elas contêm. Esse redimensionamento deve acontecer quando eu selecionar cada página.

Aquiestáo exemplo de código para gerar este bloco de notas (o exemplo contém um widget por página para o bem de simplicidade)

Então, resumindo, como eu posso dinamicamente redimensionar as páginas dos notebooks ao selecioná-las, de modo que seu espaço vertical seja adaptado para ser o mesmo que o widget filho?

    
por David Planella 30.05.2012 / 20:33

2 respostas

3

Eu não conheço uma boa resposta, mas tenho uma solução para você:

A ideia básica é que você precisa de um widget contêiner como o widget pai na cada página (não coloque, por exemplo, um rótulo diretamente na página), e você pode ocultar / mostrar tudo, exceto o contêiner (se você ocultar o contêiner também, a página desaparecerá).

Esta solução deve funcionar para hierarquias arbitrárias de widgets.

from gi.repository import Gtk

class NotebookWindow():
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file('notebook.ui')
        self.builder.get_object('window1').connect('delete-event',
            Gtk.main_quit)
        notebook = self.builder.get_object('notebook1')
        notebook.connect("switch-page", self.on_notebook1_switch_page)
        self.on_notebook1_switch_page(notebook, None,
                                      notebook.get_current_page())

    def on_notebook1_switch_page(self, widget, label, page):
        for p in range(widget.get_n_pages()):
            container = widget.get_nth_page(p)
            if not p == page:
                for c in container.get_children():
                    try:
                        c.hide_all()
                    except AttributeError:
                        c.hide()
            else:
                for c in container.get_children():
                    try:
                        c.show_all()
                    except AttributeError:
                        c.show()


if __name__ == '__main__':
    notebookwindow = NotebookWindow()
    Gtk.main()

Na minha resposta original, gravei e reinscrevi os tamanhos solicitados. Isso não funciona em geral, porque o tamanho solicitado é apenas um tamanho mínimo. Eu teria que gravar um tamanho máximo, para que isso funcionasse.

    
por xubuntix 31.05.2012 / 11:18
1

SE o widget de bloco de notas real não é necessário, mas é apenas uma maneira de manter um conteúdo semelhante e fornecer uma maneira de alternar entre eles, então pode haver soluções melhores / mais simples. Aqui está um que foi usado no final para Qreator :

a ideia principal é usar um contêiner como o Gtk.Box (chamado page_box no exemplo abaixo) e mantenha apenas um item visível. Você também precisa de uma lista com o conteúdo de cada página, cada um empacotado em um único widget (por exemplo, um Gtk.Grid ).

for page in page_list:
    self.ui.page_box.add(page.grid)

Aqui page_list é uma lista simples de objetos de página, em que o objeto de página tem uma propriedade grid (o Gtk.Grid contendo todo o conteúdo da página).

Por fim, você precisa fornecer uma maneira de alternar entre o conteúdo, por exemplo, com um conjunto de botões, cada um chamando um método de troca com o page_id correspondente quando clicado:

def switch_view(self, page_id):
    # hide all pages
    for child in self.ui.page_box.get_children():
        child.hide()
    # show the single page that is active
    self.ui.page_box.get_children()[page_id].show()

Esta não é uma resposta literal à pergunta, mas pode resolver o mesmo problema.

    
por xubuntix 01.08.2012 / 09:43