如何多次显示用 Glade 定义的对话框?
How do I show multiple times a dialog defined with Glade?
我想多次显示在 Glade 文件中定义的 Gtk.Dialog
。
目前我可以使用自定义按钮来调用对话框的 hide()
方法,但是,如果用户使用 Alt+F4关闭对话框,重新打开为空:
并且在控制台中我看到多个错误:
(main.py:29152): Gtk-CRITICAL **: 15:28:29.637: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_box_get_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_box_set_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_button_box_get_layout: assertion 'GTK_IS_BUTTON_BOX (widget)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_box_get_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_box_set_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_button_box_get_layout: assertion 'GTK_IS_BUTTON_BOX (widget)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_box_get_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_box_set_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_button_box_get_layout: assertion 'GTK_IS_BUTTON_BOX (widget)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
我正在获取具有正常 get_object()
:
的对话框实例
self.__settings_dialog : Gtk.Dialog = self.__builder.get_object("settings_dialog")
而不仅仅是调用 show()
和 hide()
。但是用 Alt+F4 关闭后,我无法再次显示它。
感谢 a Reddit user,我发现您必须连接到对话框的 delete-event
并确保 return True
以避免对话框被破坏。
首先在 Glade 中创建信号处理程序,然后在您的 Python 代码中:
def on_dialog_delete_event(self, dialog, event):
dialog.hide()
return True
我想多次显示在 Glade 文件中定义的 Gtk.Dialog
。
目前我可以使用自定义按钮来调用对话框的 hide()
方法,但是,如果用户使用 Alt+F4关闭对话框,重新打开为空:
并且在控制台中我看到多个错误:
(main.py:29152): Gtk-CRITICAL **: 15:28:29.637: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_box_get_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_box_set_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_button_box_get_layout: assertion 'GTK_IS_BUTTON_BOX (widget)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.651: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_box_get_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_box_set_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_button_box_get_layout: assertion 'GTK_IS_BUTTON_BOX (widget)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:29.697: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_box_get_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_box_set_spacing_set: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_button_box_get_layout: assertion 'GTK_IS_BUTTON_BOX (widget)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_box_set_spacing: assertion 'GTK_IS_BOX (box)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_get_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: gtk_container_set_border_width: assertion 'GTK_IS_CONTAINER (container)' failed
(main.py:29152): Gtk-CRITICAL **: 15:28:31.141: _gtk_container_set_border_width_set: assertion 'GTK_IS_CONTAINER (container)' failed
我正在获取具有正常 get_object()
:
self.__settings_dialog : Gtk.Dialog = self.__builder.get_object("settings_dialog")
而不仅仅是调用 show()
和 hide()
。但是用 Alt+F4 关闭后,我无法再次显示它。
感谢 a Reddit user,我发现您必须连接到对话框的 delete-event
并确保 return True
以避免对话框被破坏。
首先在 Glade 中创建信号处理程序,然后在您的 Python 代码中:
def on_dialog_delete_event(self, dialog, event):
dialog.hide()
return True