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
相关产品推荐
相关产品推荐

