为什么 GTK4 在打开对话框两次时显示“gtk_window_present: 断言 'GTK_IS_WINDOW (window)' failed”?

问题描述 投票:0回答:1

我目前正在使用 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()

我做错了什么?非常感谢您的帮助

-詹斯

python gtk gtk4
1个回答
0
投票

不要

close
对话框,而是
hide
它。
close
方法相当于点击系统窗口的“关闭”按钮。当然,您可以捕获它,并做一些工作(甚至阻止关闭),但“关闭”的默认操作是“隐藏并销毁”。

或者,您可以在呈现对话框之前将对话框创建代码移动到您的

on_button_clicked
中。这样每次都会重新创建它,但不会保留内存,就像您在父窗口初始化期间创建它并保留直到该窗口被销毁一样。

© www.soinside.com 2019 - 2024. All rights reserved.