Я создаю простое приложение 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()
Главное окно
Второе Окно - Toplevel
Второе окно - Пусто
Почему это происходит и как мне решить эту проблему ?
Хорошо, то, что делает ваш код, это позволяет разрушить второе окно. После этого его нет.
Вы можете либо сохранить окно от разрушения (и вместо этого скрыть его), добавив эти две строки в конце вашего метода 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)