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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:13:23