如何在PyGObject的Gtk 4中使用CSS?解决Gdk.Screen报错问题
Gtk 4.0 中使用PyGObject加载CSS的正确方式
问题原因
Gtk 4.0 彻底移除了 Gdk.Screen 类,你之前的代码是针对Gtk 3.x的写法,因此会抛出'gi.repository.Gdk' object has no attribute 'Screen'错误。
修正后的代码实现
在Gtk 4中,样式提供者需要绑定到Gdk.Display而非Gdk.Screen,同时注意load_from_data方法需要传入字节串而非字符串。以下是可运行的完整示例:
import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk, Gdk def on_activate(app): win = Gtk.ApplicationWindow(application=app) win.set_title("Gtk4 CSS 测试") win.set_default_size(400, 300) # 定义临时CSS css = '* { background-color: #f00; }' css_provider = Gtk.CssProvider() # 将字符串编码为字节串传入 css_provider.load_from_data(css.encode()) # 获取默认显示设备 display = Gdk.Display.get_default() # 为整个Display应用样式提供者 Gtk.StyleContext.add_provider_for_display( display, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) win.present() app = Gtk.Application(application_id='org.example.CssTest') app.connect('activate', on_activate) app.run(None)
关键改动点
- 替换
Gdk.Screen.get_default()为Gdk.Display.get_default() - 使用
Gtk.StyleContext.add_provider_for_display()替代旧的add_provider_for_screen()方法 - 调用
load_from_data时,将CSS字符串通过encode()转为字节串(PyGObject的要求)
内容的提问来源于stack exchange,提问作者stysan
相关产品推荐
相关产品推荐

