我目前正在使用 Python、GTK4 和 libadwaita 开发 GUI。 到目前为止,我的经验相当不错,但现在我遇到了一个问题: 当我创建
AdwDialog
时,我可以打开它一次,但如果我关闭它并尝试重新打开它,我会收到以下错误消息:
(python3:45276): Gtk-CRITICAL **: 09:46:38.651: gtk_window_present: assertion 'GTK_IS_WINDOW (window)' failed
这是此行为的最小可重现示例:
import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw
class DemoWindow(Gtk.ApplicationWindow):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.set_title("Dialog Example")
self.set_default_size(200, 100)
self.dialog = Adw.Dialog(title="Dialog Example", parent=self)
self.closebtn = Gtk.Button(label="Close")
self.closebtn.connect("clicked", self.on_close_clicked)
self.dialog.set_child(self.closebtn)
button = Gtk.Button(label="Open Dialog")
button.connect("clicked", self.on_button_clicked)
self.set_child(button)
def on_button_clicked(self, button):
self.dialog.present(self.get_root())
def on_close_clicked(self, button):
self.dialog.close()
class DemoApp(Adw.Application):
def __init__(self):
super().__init__(application_id="org.example.demoapp")
self.connect("activate", self.on_activate)
def on_activate(self, app):
self.win = DemoWindow(application=app)
self.win.present()
if __name__ == "__main__":
DemoApp().run()
我做错了什么?非常感谢您的帮助
-詹斯
不要
close
对话框,而是 hide
它。 close
方法相当于点击系统窗口的“关闭”按钮。当然,您可以捕获它,并做一些工作(甚至阻止关闭),但“关闭”的默认操作是“隐藏并销毁”。
或者,您可以在呈现对话框之前将对话框创建代码移动到您的
on_button_clicked
中。这样每次都会重新创建它,但不会保留内存,就像您在父窗口初始化期间创建它并保留直到该窗口被销毁一样。