Como redimensionar dinamicamente as páginas do Notebook GTK -- python campo com application-development campo com gtk campo com pygi camp askubuntu Relacionado O problema

How to dynamically resize GTK notebook pages


5
vote

problema

português

Eu tenho um aplicativo Python que usa um widget abcdefghgjklmnabcdefghijklmn0 para exibir diferentes páginas. 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 notebook.

Mas eu realmente gostaria que meu aplicativo redimensione as páginas para não desperdiçar espaço vertical e adaptar, isto é, ser redimensionado para o mesmo tamanho vertical que o widget que eles contêm. Este redimensionamento deve acontecer quando eu selecionar cada página.

App mostrando espaço vertical indesejado

Aqui está o código de exemplo para gerar este notebook (o exemplo contém um widget por página por uma questão de simplicidade)

Então, em suma, como posso redimensionar dinamicamente as páginas notebook ao selecioná-las, para que seu espaço vertical seja adaptado para ser o mesmo que seu widget filho?

english

I've got a Python app that uses a Gtk.Notebook widget to display different pages. Each of these pages contain a different set of widgets, and I've noticed that the 'tallest' widget in terms of vertical space defines the overall vertical size of the notebook.

But I'd actually like my app to resize the pages to not waste vertical space, and adapt, that is, get resized to the same vertical size as the widget they contain. This resize should happen when I select each page.

Test app showing undesired vertical space

Here's the sample code to generate this notebook (the example contains a widget per page for the sake of simplicity)

So in short, how can I dynamically resize notebook pages upon selecting them, so that their vertical space is adapted to be the same as their child widget?

           

Lista de respostas

3
 
vote

Eu não sei uma resposta legal, mas tenho um trabalho para você:

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

Esta solução deve funcionar para hierarquias de widgets arbitrárias.
  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 re-instalei os tamanhos solicitados. Isso não funciona em geral, porque o tamanho solicitado é apenas um tamanho mínimo. Eu teria que registrar um tamanho máximo, para que isso funcionasse, no entanto.

 

I do not know a nice answer, but I have a work-around for you:

The basic idea is that you need a container widget as the parent widget in each page (do not place e.g. a label directly in the page), and you can hide/show everything except the container (If you hide the container as well, the page will disappear).

This solution should work for otherwise arbitrary widget hierarchies.

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() 

In my original answer I recorded and re-instated the requested sizes. This does not work in general, because the requested size is only a minimal size. I would have to record a maximum size, in order for this to work, though.

 
 
         
         
1
 
vote

Se O widget do notebook real não for necessário, mas é meramente uma maneira de manter conteúdo semelhante juntos e fornecer uma maneira de alternar entre eles, então pode haver soluções melhores / mais simples. Aqui é aquele que estava no final usado para Qreator :

A ideia principal é usar um contêiner como um 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 ABCDEFGHIJKLMNABCDEFGHIJKLMN7 é uma lista simples de objetos de página, onde o objeto de página tem um grid propriedade (o gtk.grid contendo todo o conteúdo da página).

Por fim, você precisa fornecer uma maneira de alternar entre o conteúdo, e. Com um conjunto de botões, cada um chamando um método de mudança com o ABCDEFGHIJKLMNABCDEFGHIJKLMN9 quando clicado:
  sshd0   

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

 

IF the actual notebook widget is not needed, but is merely a way to keep similar content together and provide a way to switch between them, then there might be better/simpler solutions. Here is one that was in the end used for Qreator:

the main idea is to use a container like a Gtk.Box (called page_box in the example below) and keep only one item visible. You also need a list with the content of each page, each packed into a single widget (e.g. a Gtk.Grid).

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

Here page_list is a simple list of page objects, where the page object has a grid property (the Gtk.Grid containing all the page content).

At last, you need to provide a way to switch between the contents, e.g. with a set of buttons, each calling a switch method with the corresponding page_id when clicked:

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() 

This is not a literal answer to the question, but it might solve the same problem.

 
 

Perguntas relacionadas

2  Como posso adicionar dinamicamente um widget que posso buscar com uma instância GTK.Builder?  ( How can i dynamically add a widget that i can then fetch with a gtk builder inst ) 
Se eu quiser adicionar dinamicamente uma linha a um vbox e preenchê-lo ... Eu preciso de uma maneira de ver se essa linha já existe. Então o trem de pensament...

2  Existe uma maneira simples com o Pygi para fazer uma janela inteira uma alvo de queda para entrada externa?  ( Is there a simple way with pygi to make an entire window a drop target for exter ) 
Exemplo: Soltar um arquivo em uma janela projetada e desencadeia handler.open_from_path (caminho) ...

4  Como um serviço de sessão do Python DBUS sabe que o usuário está logando?  ( How does a python dbus session service know the user is logging out ) 
Diga que você tem um serviço DBUS no barramento da sessão (o barramento por usuário). Seu serviço pode ser iniciado através de um arquivo /etc/xdg/autostart/...

1  Como posso exportar um arquivo .ui para uma janela Pygi que eu construo dinamicamente?  ( How can i export a ui file for a pygi window that i build dynamically ) 
Eu entendo que construir coisas com a mentalidade do MVC é uma coisa boa. Eu também entendo que, se você separar a manutenção e a interface do usuário de códi...

1  Como atualização pygobject sem quebrar qualquer dependência?  ( How update pygobject without breaking any dependency ) 
Eu quero atualizar o Pygobject do meu sistema do repositório oficial. A última versão no repositório oficial é 3.16.1 , mas no pacote oficial para o Ubuntu...

6  Como se livrar do gradiente de fundo do Inline GTKtoolbar?  ( How to get rid of the background gradient of the inline gtktoolbar ) 
Quando você executa o código abaixo, ele mostrará uma barra de ferramentas inline em uma janela. Observe como a barra de ferramentas Inline tem um backbround ...

1  Como alterar as guias GTK.notebook  ( How to change gtk notebook tabs ) 
Há uma maneira de alterar a guia GTK.notebook padrão? Eu quero perceber um botão de tabulação plana ...

0  Que embalagem constante para usar para set_child_packing () no python  ( Which packing constant to use for set child packing in python ) 
Eu quero mudar um filho de preenchimento de uma caixa; Então estou usando set_child_packing no caixa segurando a criança. Não consigo descobrir o que usar c...

9  Pygtk para pigi: gtk.timeout_add equivalente  ( Pygtk to pygi gtk timeout add equivalent ) 
Eu convertei algum código Python para usar pygi, mas não consigo descobrir como converter esta linha: gtk.timeout_add(PING_FREQUENCY * 1000, self.doWork) ...

2  Como um OSD deve ser codificado com pygi?  ( How should an osd be coded with pygi ) 
Como um OSD destina-se a ser codificado, usando pygobject? É apenas uma janela não decorrente que é pintura de aplicação? Por favor, forneça todos os detalhes...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.