2016-11-23 88 views
2

您好我是新的python和Gtk + 3開發。我試圖用Gtk + 3創建一個包含Gtk.TreeView的Gui。我試圖以不同的顏色顯示TreeView的奇怪記錄,但我總是失敗。我搜索整個互聯網和StackOverFlow,但我沒有找到有用的東西。所以我求求你的幫助。 使用Python 3.4.3的i.m。提前致謝!Python 3和Gtk + 3 - 問題與TreeView和行的替代顏色

#!/usr/bin/env python3 
# -*- coding: ISO-8859-1 -*- 
import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gdk 


xim = [("Oranges", 5), ("Apples", 3), ("Bananas", 1), ("Tomatoes", 4), ("Cucumber", 1), ("potatoes", 10), 
     ("apricot", 100)] 


window = Gtk.Window() 
window.connect("destroy", lambda q: Gtk.main_quit()) 
liststore = Gtk.ListStore(str, int) 
for i in range(len(xim)): 
    liststore.append(xim[i]) 
treeview = Gtk.TreeView(model=liststore) 
window.add(treeview) 
treeviewcolumn = Gtk.TreeViewColumn("Item") 
treeview.append_column(treeviewcolumn) 
cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, "text", 0) 
treeviewcolumn = Gtk.TreeViewColumn("Quantity") 
treeview.append_column(treeviewcolumn) 
cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, "text", 1) 
css_provider = Gtk.CssProvider() 
css = """ 
GtkTreeView row:nth-child(odd){background-color: #ccc} 
      """ 
css_provider.load_from_data(css.encode()) 
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), 
             css_provider, 
             Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) 
window.show_all() 
Gtk.main() 
+0

這似乎是在GTK + 3.18和較高的問題,根據此評論http://stackoverflow.com/questions/36002296/how- to-alternate-light-dark-rows-in-gtktreeview#comment60118257_36047961 – B8vrede

回答

3

我知道它應該更好地使用CSS來改變窗口小部件的風格,但還有另一種解決方案可行。

使用背景顏色值在ListStore中添加另一列,並將屬性「background」添加到兩個CellRendererText中。這樣,每一行都會從ListStore中恢復背景屬性。你應該爲每一行使用不同的顏色。

這是修改你的代碼我的技術:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gdk 


xim = [("Oranges", 5), ("Apples", 3), ("Bananas", 1), ("Tomatoes", 4), ("Cucumber", 1), ("potatoes", 10), 
     ("apricot", 100)] 

window = Gtk.Window() 
window.connect("destroy", lambda q: Gtk.main_quit()) 
liststore = Gtk.ListStore(str, int, str) 
for i in range(len(xim)): 
    if i % 2 == 0: 
     background_color = "#fff" 
    else: 
     background_color = "#bbb" 
    liststore.append(xim[i] + (background_color,)) 

treeview = Gtk.TreeView(model=liststore) 
window.add(treeview) 
treeviewcolumn = Gtk.TreeViewColumn("Item") 
treeview.append_column(treeviewcolumn) 
cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, "text", 0) 
treeviewcolumn.add_attribute(cellrenderertext, "background", 2) 

treeviewcolumn = Gtk.TreeViewColumn("Quantity") 
treeview.append_column(treeviewcolumn) 
cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, "text", 1) 
treeviewcolumn.add_attribute(cellrenderertext, "background", 2) 

window.show_all() 
Gtk.main() 
+0

它像一個魅力,非常感謝! – Bgo