GTK3中更新已初始化容器内容:新控件无法显示问题解决
GTK3 动态替换容器内容的解决方案
你的代码核心问题并非Gtk.Box已被添加到窗口导致无法插入新控件,而是新创建的button2未设置可见性。GTK控件默认处于隐藏状态,初始化时调用的self.show_all()仅对当时存在的控件生效,后续动态生成的控件需要手动触发显示。
修复方法
有两种方式可以让新按钮显示:
- 直接调用新按钮的
show()方法 - 调用容器的
show_all()方法,让容器内所有控件(包括新创建的)可见
修复后的完整代码
import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk class MyWindow(Gtk.Window): def __init__(self): super().__init__() self.set_default_size(200, 200) self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) button1 = Gtk.Button("_OLD_") button1.connect("clicked", self.on_button_click) self.box.add(button1) self.add(self.box) self.show_all() def on_button_click(self, button): # 销毁容器内所有子控件 for child in self.box.get_children(): child.destroy() # 创建新按钮并添加到容器 button2 = Gtk.Button("_NEW_") self.box.add(button2) # 显示新按钮(二选一即可) button2.show() # 或者使用:self.box.show_all() if __name__ == "__main__": window = MyWindow() Gtk.main()
补充说明
destroy()方法会彻底移除并销毁旧控件,释放其占用的资源show()仅作用于单个控件,show_all()会递归显示容器内所有层级的控件,适合容器内新增多个控件的场景
内容的提问来源于stack exchange,提问作者ntfs1984
相关产品推荐
相关产品推荐

