Python GTK+3 出现Can't set a parent on a toplevel widget警告原因
GTK警告触发原因与修复方案
为什么会触发该警告?
Gtk.Window本身就属于顶层控件(toplevel widget),GTK框架规定顶层控件天生为独立窗口,不能被添加到任何其他容器控件内部。你代码中将继承自Gtk.Window的PluginWindow实例通过master_win.add(win)方法加入Gtk.ScrolledWindow容器,直接违反了该规则,因此触发了警告。
master_win 是不是顶层控件?
不是。Gtk.ScrolledWindow只是普通的滚动容器控件,它本身需要被放到顶层控件(比如Gtk.Window)中才能正常渲染显示,你对顶层控件的定义认知存在偏差:只有Gtk.Window及其子类(比如Gtk.Dialog)属于顶层控件,其余大部分容器/功能控件都属于非顶层控件,需要挂载到顶层控件下才能工作。
代码修复方案
正确的逻辑是将滚动容器放到窗口内部,而非把窗口塞到滚动容器里,修改后的代码参考如下:
import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk class PluginWindow(Gtk.Window): def __init__(self): super().__init__(title="Stack Demo") # 1. 创建滚动容器 master_win = Gtk.ScrolledWindow() master_win.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS) # 2. 把你需要展示的业务内容控件加到滚动容器中 # 示例:content = Gtk.Label(label="测试内容\n"*100) # master_win.add(content) # 3. 把滚动容器加到当前窗口中 self.add(master_win) win = PluginWindow() win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main()
如果你的业务场景确实需要在一个窗口内嵌入另一个独立窗口的效果,不要使用Gtk.Window实现,可以选用Gtk.Frame、Gtk.Popover或者Gtk.Dialog等适配对应场景的控件。
内容的提问来源于stack exchange,提问作者user3565923
相关产品推荐
相关产品推荐

