Управление окнами с помощью pygtk
-
19-09-2019 - |
Вопрос
У меня возникла проблема с окнами PyGTK и GTK Builder.Вот упрощенная версия моего кода.
class GUI:
def __init__(self,parent):
builder_file = "./ui/window.builder"
self.builder = gtk.Builder()
self.builder.add_from_file(builder_file)
self.window = self.builder.get_object('main')
self.builder.connect_signals( self )
self.populate_window()
self.window.show()
def populate_window(self):
hbox = self.builder.get_object('hbox')
hbox.pack_start( somewidgets )
def on_destroy(self):
self.window.destroy()
Файл gtk builder просто содержит окно верхнего уровня с горизонтальной упаковочной рамкой и сигналом к уничтожению.Кажется, это работает, и окно создается и заполняется просто отлично, но если я попытаюсь уничтожить окно, которое было заполнено любыми другими виджетами, python segfaults.
Я думаю, что это какая-то проблема с упаковкой новых виджетов, которых нет в файле builder, поэтому pygtk не знает, как их удалить, но я все же не уверен.
Спасибо за любую помощь.
Решение
Ваш обработчик "уничтожить" вызывается, когда окно еще не уничтожено, поэтому этот фрагмент кода:
def on_destroy(self):
self.window.destroy()
сгенерирует бесконечный рекурсивный вызов.Другими словами, вы разрушаете то, что еще только разрушается.
Это не имеет ничего общего с GtkBuilder или виджетами с ручным кодом, но я подозреваю, что мне чего-то не хватает, потому что я не знаю, зачем вам нужно что-то подключать к GtkWindow::destroy.
Другие советы
Использование gtk.main_quit()
.
def on_destroy(self): gtk.main_quit()