Glade, pygobject - закрытие и открытие окна - Gtk-CRITICAL ошибка и сбой - PullRequest
0 голосов
/ 01 июня 2018

Я создал приложение с двумя окнами с Glade и pygobject.У меня есть окно с кнопкой открытия окна, которое открывает второе окно.Второе окно имеет кнопку закрытия.Когда я нажимаю кнопку закрытия, она что-то печатает на терминал и запускает функцию «.hide_on_delete ()», которая закрывает второе окно.

Когда я снова нажимаю кнопку открытия окна, открывается окноснова с простым ".show ()".И я могу делать это так часто, как захочу.

Однако есть проблема, когда я закрываю второе окно с "x" в правом верхнем углу вместо с помощью кнопки закрытия, которую я создал.На поляне я установил событие «уничтожить» и дал ему правильное имя функции.Когда я закрываю второе окно через «x», оно даже печатает «Нажал на кнопку X» и закрывает второе окно.Но когда я снова открываю его, я просто получаю черный квадрат без оформления окна, и когда я нажимаю на него, я получаю это сообщение об ошибке:

(main.py:11083): Gtk-CRITICAL **: 21:37:50.904: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_get_settings: assertion 'GTK_IS_WIDGET (widget)' failed
/usr/lib/python3.6/site-packages/gi/overrides/Gtk.py:1612: Warning: g_object_get: assertion 'G_IS_OBJECT (object)' failed
  return _Gtk_main(*args, **kwargs)

(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

Вот мои функции:

def on_second_window_destroy(self, *args):
    print("x Button clicked")
    app.builder.get_object("second_window").hide_on_delete() 

def on_new_window_button_clicked(self, *args):
    app.builder.get_object("second_window").show()

def on_close_button_clicked(self, *args):
    print("close Button clicked")
    app.builder.get_object("second_window").hide_on_delete() 

Кнопка закрытия и кнопка "x" запускают точно такую ​​же функцию.Почему один позволяет мне снова открыть окно, а другой нет?Я действительно не понимаю, в чем дело.

Большое спасибо заранее за любую помощь!

1 Ответ

0 голосов
/ 03 июня 2018

Как я уже упоминал в комментариях, вы должны быть подключены к сигналу "delete-event".Это обратный вызов выглядит следующим образом:

gboolean
user_function (GtkWidget *widget,
               GdkEvent  *event,
               gpointer   user_data)

Вы должны вернуть True, чтобы остановить вызов других обработчиков для события.False для дальнейшего распространения события.

Gtk.Widget.hide_on_delete() всегда возвращает true, поэтому прямое подключение этой функции к сигналу прекращает излучение.Итак, напишите return app.builder.get_object("second_window").hide_on_delete() и все готово.

...