окно gtk3 перерисовывается неправильно

Я создаю простое приложение GTK3. Главное окно верхнего уровня имеет кнопку search , которая будет отображать другое окно верхнего уровня gtk3. Когда я нажимаю кнопку закрытия (рядом с заголовком) во втором окне gtk3, оно закрывается, как и ожидалось. Однако, когда я снова нажимаю на кнопку поиска, второе окно верхнего уровня не перерисовывается со всеми его виджетами .. Вместо этого оно кажется пустым.

Если, с другой стороны, я нажимаю кнопку закрытия (кнопка gtk видна внизу), она закрывается правильно. И при повторном открытии видны все виджеты.

Информация : Я создал интерфейс с помощью Glade.

Код отображается ниже. Однако, чтобы получить файлы пользовательского интерфейса, вам нужно скачать пакет. Вы можете скачать их здесь

#! /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()

Главное окно enter image description here

Второе Окно - Toplevel enter image description here

Второе окно - Пусто enter image description here

Почему это происходит и как мне решить эту проблему ?

2
задан 17 May 2012 в 01:34

1 ответ

Хорошо, то, что делает ваш код, это позволяет разрушить второе окно. После этого его нет.

Вы можете либо сохранить окно от разрушения (и вместо этого скрыть его), добавив эти две строки в конце вашего метода init:

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

, который заменяет событие удаления ( документация здесь ).

Или вы можете воссоздавать окно каждый раз, когда открываете его, помещая эти строки в начало вашего метода search_clicked:

self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)
0
ответ дан 17 May 2012 в 01:34

Другие вопросы по тегам:

Похожие вопросы: