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

PyGObject中Gtk.TreeView奇偶行设置不同颜色的问题

解决Gtk.TreeView交替行颜色不生效的问题

你的代码逻辑没问题,主要是CSS选择器的写法不符合Gtk3的CSS规范导致样式没生效。Gtk3的CSS选择器使用元素的小写名称(比如treeview),而非Python类名Gtk.TreeView,且需要正确定位到行元素。

下面是修正后的完整代码:

#!/usr/bin/env python3
import datetime
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk

class TreeView(Gtk.TreeView):
    def __init__(self):
        # model
        self.model = Gtk.ListStore.new([int])
        for i in range(5):
            self.model.append([i])
        # view
        Gtk.TreeView.__init__(self, self.model)
        # style
        css_provider = Gtk.CssProvider()
        # 修正CSS选择器为小写的treeview,正确定位row元素
        css_provider.load_from_data('''
        treeview row:nth-child(even) {
            background-color: #d0e4f7;
        }
        treeview row:nth-child(odd) {
            background-color: #fdffff;
        }
        '''.encode('utf-8'))
        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
        self.set_rules_hint(True)
        col = Gtk.TreeViewColumn('int', Gtk.CellRendererText(), text=0)
        self.append_column(col)

class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title='Mein Gtk-Fenster')
        self.set_default_size(100, 120)
        self.view = TreeView()
        self.add(self.view)
        self.connect('destroy', Gtk.main_quit)
        self.show_all()

if __name__ == '__main__':
    win = Window()
    Gtk.main()

关键调整说明:

  • CSS选择器修正:把Gtk.TreeView row改成treeview row——Gtk3的CSS采用元素小写标签名,而非Python类名的写法。
  • 保留set_rules_hint(True):这个方法会告知Gtk启用交替行样式提示,确保自定义CSS能正确匹配奇偶行。
  • 若遇到默认样式覆盖自定义样式的优先级问题,可临时给颜色属性加!important(不推荐长期使用,优先保证选择器准确性):
    treeview row:nth-child(even) {
        background-color: #d0e4f7 !important;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:53