gtk3 janela não é redesenhada corretamente

2

Estou criando um aplicativo GTK3 simples. A janela principal de nível superior tem um botão pesquisa que exibirá outra janela gtk3 de nível superior. Quando clico no botão fechar (perto da barra de título) na segunda janela gtk3, fecha como esperado. No entanto, quando clico no botão de pesquisa novamente, a segunda janela de nível superior não é redesenhada com todos os seus widgets ... em vez disso, ela aparece vazia.

Se, por outro lado, eu clicar no botão fechar (botão gtk visto na parte inferior), ele fecha corretamente. E quando reaberto, todos os widgets podem ser vistos.

Info : criei a interface do usuário usando o Glade.

O código é exibido abaixo. No entanto, para obter os arquivos da interface do usuário, você precisa baixar o pacote. Você pode baixá-los aqui

#! /usr/bin/env python

from gi.repository import Gtk
import os,sys

UI_FILE = "main.ui"
SECOND_UI_FILE = "second.ui"

class SampleApp:
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file(UI_FILE)
        self.builder.connect_signals(self)

        self.builder2 = Gtk.Builder()
        self.builder2.add_from_file(SECOND_UI_FILE)
        self.builder2.connect_signals(self)

        self.window = self.builder.get_object('window')
        self.window.set_position(Gtk.WindowPosition.CENTER)
        self.window.connect("destroy", self.destroy)
        self.window.show_all()

        self.search = self.builder.get_object('button1')
        self.search.connect("clicked", self.search_clicked)

    def destroy(self, window):
        Gtk.main_quit()

    def search_clicked(self, window):
        self.secondwindow = self.builder2.get_object('window1')
        self.secondwindow.show_all()

def main():
    app = SampleApp()
    Gtk.main()

if __name__ == "__main__":
    main()

Janela principal

Segundajanela-nívelsuperior

Segunda janela - em branco

Por que isso acontece e como posso resolver isso?

    
por nik90 16.05.2012 / 12:57

1 resposta

3

Ok, o que seu código faz é, ele deixa a segunda janela ser destruída. Depois disso foi embora.

Você pode impedir que a janela seja destruída (e ocultá-la) adicionando essas duas linhas no final do método init :

secondwindow = self.builder2.get_object('window1')
secondwindow.connect('delete-event', lambda w, e: w.hide() or True)

que substitui o evento de exclusão ( documentação aqui ).

Ou você pode recriar a janela toda vez que abri-la, colocando essas linhas no início do seu método search_clicked :

self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)
    
por xubuntix 16.05.2012 / 13:50