PyGObject与GTK环境下Libadwaita主题不生效(顶部栏样式异常)求助
PyGObject与GTK环境下Libadwaita主题不生效(顶部栏样式异常)求助
我太懂你这种困惑了——明明代码里已经引入了Libadwaita,也用了Adw.Application,结果窗口顶栏还是GTK原生的样子,完全没出Libadwaita那种精致的设计感,其他控件倒是正常,这真的很让人挠头!
问题的核心其实很简单:你目前的窗口类继承的是Gtk.ApplicationWindow,而不是Libadwaita专门提供的Adw.ApplicationWindow。后者才会自动应用Libadwaita的窗口装饰和主题样式,前者只会用系统原生的GTK窗口框架,所以顶栏才会不对味。
给你两个关键修改点,改完就能看到预期的Libadwaita顶栏了:
- 把
MainWindow的父类从Gtk.ApplicationWindow替换成Adw.ApplicationWindow - 建议搭配
Adw.HeaderBar来组织窗口顶部的控件,这是Libadwaita的标准布局方式,能让顶栏的样式更完整
下面是修改后的完整代码:
import sys import gi gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw class MainWindow(Adw.ApplicationWindow): # 这里改成Adw.ApplicationWindow def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_title('Test') self.set_default_size(800, 600) # 创建Libadwaita的HeaderBar作为顶栏 header_bar = Adw.HeaderBar() self.set_titlebar(header_bar) # 把按钮放到HeaderBar里(也可以继续用垂直Box放其他内容) button = Gtk.Button.new_with_label("Test") button.connect("clicked", self.on_button_clicked) header_bar.pack_end(button) # 主内容区域的Box box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.set_child(box) # 如果需要在主区域加其他控件,继续append到box里即可 # box.append(...) def on_button_clicked(self, button): print("Button was clicked") class MyApp(Adw.Application): def __init__(self, **kwargs): super().__init__(**kwargs) self.connect('activate', self.on_activate) def on_activate(self, app): self.win = MainWindow(application=app) self.win.present() app = MyApp(application_id='com.example.GtkApplication') app.run(sys.argv)
解释下为什么这样改:
Adw.ApplicationWindow是Libadwaita为GTK4定制的窗口类,它会自动接管窗口的装饰逻辑,应用Libadwaita的主题样式,包括顶栏的圆角、控件样式等Adw.HeaderBar是Libadwaita的标准顶栏组件,它会自动适配不同系统的窗口行为,同时保持Libadwaita的设计风格,把按钮放到这里比直接放在窗口根Box里更符合规范
运行修改后的代码,你应该就能看到和预期一致的Libadwaita风格顶栏啦!
备注:内容来源于stack exchange,提问作者nimafanniasl
相关产品推荐
相关产品推荐

