Gtk 对话框只出现一次
Gtk Dialogs appear only once
我正在使用 python 和 GTK (PyGobject) 编写一个 GUI 应用程序。这是我的申请 class:
class Application(Gtk.Application):
def __init__(self, *args, **kwargs):
super().__init__(*args, application_id='org.tractor.carburetor', **kwargs)
self.window = None
self.prefs = None
self.about = None
def do_startup(self):
Gtk.Application.do_startup(self)
action = Gio.SimpleAction.new('preferences', None)
action.connect('activate', self.on_preferences)
self.add_action(action)
action = Gio.SimpleAction.new('about', None)
action.connect('activate', self.on_about)
self.add_action(action)
action = Gio.SimpleAction.new("quit", None)
action.connect('activate', self.on_quit)
self.add_action(action)
def do_activate(self):
if not self.window:
window = AppWindow(application=self) #GtkApplicationWindow
self.window = window
self.window.present()
def on_preferences(self, action, param):
if not self.prefs:
prefs_window = ui.get('PreferencesWindow') #HdyPreferencesWindow
prefs_window.set_transient_for(self.window)
self.prefs = prefs_window
self.prefs.show()
def on_about(self, action, param):
if not self.about:
about_dialog = ui.get('AboutDialog') #GtkAboutDialog
about_dialog.set_transient_for(self.window)
self.about = about_dialog
self.about.show()
def on_quit(self, action, param):
self.quit()
当我在应用程序菜单中单击首选项或关于时,一切正常。但是关闭对话框后,如果我再次单击它们,就会出现错误,并且会出现一个空的 window。
错误如下:
(carburetor:157852): Gtk-CRITICAL **: 19:41:29.887: gtk_widget_show: assertion
'GTK_IS_WIDGET (widget)' failed
(carburetor:157852): Gtk-CRITICAL **: 19:41:29.887: gtk_label_set_markup:
assertion 'GTK_IS_LABEL (label)' failed
您需要覆盖它们关闭时发生的情况,以免它们被破坏,而只是隐藏它们。您可以通过向 destroy 事件的对话框添加一个事件处理程序来完成此操作,然后只需执行 dialog_window.hide()
以便您可以使用 present 重新显示它们。也不要忘记 return 正确的布尔值以抑制进一步的事件传播。
我正在使用 python 和 GTK (PyGobject) 编写一个 GUI 应用程序。这是我的申请 class:
class Application(Gtk.Application):
def __init__(self, *args, **kwargs):
super().__init__(*args, application_id='org.tractor.carburetor', **kwargs)
self.window = None
self.prefs = None
self.about = None
def do_startup(self):
Gtk.Application.do_startup(self)
action = Gio.SimpleAction.new('preferences', None)
action.connect('activate', self.on_preferences)
self.add_action(action)
action = Gio.SimpleAction.new('about', None)
action.connect('activate', self.on_about)
self.add_action(action)
action = Gio.SimpleAction.new("quit", None)
action.connect('activate', self.on_quit)
self.add_action(action)
def do_activate(self):
if not self.window:
window = AppWindow(application=self) #GtkApplicationWindow
self.window = window
self.window.present()
def on_preferences(self, action, param):
if not self.prefs:
prefs_window = ui.get('PreferencesWindow') #HdyPreferencesWindow
prefs_window.set_transient_for(self.window)
self.prefs = prefs_window
self.prefs.show()
def on_about(self, action, param):
if not self.about:
about_dialog = ui.get('AboutDialog') #GtkAboutDialog
about_dialog.set_transient_for(self.window)
self.about = about_dialog
self.about.show()
def on_quit(self, action, param):
self.quit()
当我在应用程序菜单中单击首选项或关于时,一切正常。但是关闭对话框后,如果我再次单击它们,就会出现错误,并且会出现一个空的 window。
错误如下:
(carburetor:157852): Gtk-CRITICAL **: 19:41:29.887: gtk_widget_show: assertion
'GTK_IS_WIDGET (widget)' failed
(carburetor:157852): Gtk-CRITICAL **: 19:41:29.887: gtk_label_set_markup:
assertion 'GTK_IS_LABEL (label)' failed
您需要覆盖它们关闭时发生的情况,以免它们被破坏,而只是隐藏它们。您可以通过向 destroy 事件的对话框添加一个事件处理程序来完成此操作,然后只需执行 dialog_window.hide()
以便您可以使用 present 重新显示它们。也不要忘记 return 正确的布尔值以抑制进一步的事件传播。