You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyGObject结合Libadwaita创建GTK4 Flap仅显示空窗口如何解决

问题分析
  • 子控件设置逻辑错误:先调用self.set_child(child=box)给窗口绑定了Box作为子控件,后续又调用self.set_child(child=adw_flap)直接覆盖了该设置,之前创建的Box完全没有被用到,且没有执行box.append(adw_flap)将Flap添加到Box中,原有实现逻辑完全不生效。
  • Adw.Flap未配置必要内容:Adw.Flap是三栏结构容器组件,必须至少设置content(主内容区,折叠侧边板时显示的部分)、flap(侧边板内容)两个属性,仅新建空的Flap实例没有添加任何子内容,自然不会显示任何元素。
常见疑问解答

不需要保留Gtk.Box。Adw.Flap本身就是继承自Gtk.Widget的容器组件,可以直接通过set_child()设置为窗口的根控件,不需要额外套一层Box,额外嵌套反而会增加不必要的布局层级,只有需要在Flap外层和窗口之间添加其他全局控件时才需要额外套容器。

修正后可运行代码
import gi

gi.require_version(namespace='Gtk', version='4.0')
gi.require_version(namespace='Adw', version='1')

from gi.repository import Gio, Gtk
from gi.repository import Adw

class MainWindow(Gtk.ApplicationWindow):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_title(title='Python and GTK 4 Adwaita: PyGObject Adw.Flap')
        self.set_default_size(600, 400)

        # 直接初始化Flap,无需额外套Box
        adw_flap = Adw.Flap.new()
        # 设置侧边板位置和默认宽度
        adw_flap.set_flap_position(Gtk.PackType.START)
        adw_flap.set_flap_width(200)

        # 给侧边板添加内容
        flap_sidebar = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12, margin_top=12, margin_bottom=12, margin_start=12, margin_end=12)
        flap_sidebar.append(Gtk.Label(label="侧边板内容"))
        flap_sidebar.append(Gtk.Button(label="侧边功能按钮"))
        adw_flap.set_flap(flap_sidebar)

        # 给主内容区添加内容
        main_content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12, margin_top=12, margin_bottom=12, margin_start=12, margin_end=12)
        # 添加切换侧边板的控制按钮
        toggle_btn = Gtk.Button(label="切换侧边板显示")
        toggle_btn.connect("clicked", lambda _: adw_flap.set_reveal_flap(not adw_flap.get_reveal_flap()))
        main_content.append(toggle_btn)
        main_content.append(Gtk.Label(label="主内容展示区"))
        adw_flap.set_content(main_content)

        # 直接将Flap设置为窗口子控件
        self.set_child(adw_flap)


class Application(Gtk.Application):
    def __init__(self):
        super().__init__(application_id='adw.flap.demo',
                         flags=Gio.ApplicationFlags.FLAGS_NONE)

    def do_activate(self):
        win = self.props.active_window
        if not win:
            win = MainWindow(application=self)
        win.present()


if __name__ == '__main__':
    import sys
    app = Application()
    app.run(sys.argv)
修正说明
  • 删除了无用的Gtk.Box嵌套逻辑,直接将Flap设为窗口根控件
  • 给Flap分别配置了侧边板和主内容区的子元素
  • 新增了侧边板切换控制按钮,可直接验证Flap功能正常
  • 增加了窗口默认大小配置,避免启动时窗口过小无法显示内容

内容的提问来源于stack exchange,提问作者g3blv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:45:04