2016-03-15 36 views
2

我已閱讀,並嘗試了現有的解決方案,我無法讓他們工作。我希望有人能指出我做錯了什麼,或者告訴我爲什麼這些解決方案不再有效。如何在GtkTreeView中交替亮/黑行?

我想是肯定這些解決方案不起作用,所以我製作了這樣的樣式表:

GtkTreeView row { 
    color: #FFFFFF; 
    background-color: #FF0000; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #FF00FF; 
} 
GtkTreeView row:nth-child(odd) { 
    background-color: #00FFFF; 
} 

帶有花色,只是爲了讓行色的差異真的很明顯。於是,我做了一個小的應用程序加載了一個樹視圖:

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) 
{ 
    int i; 
    gtk_init(&argc,&argv); 
    //GtkBuilder* b = gtk_builder_new_from_file("derp.glade.xml"); 
    GtkWidget* top = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    GtkListStore* items = gtk_list_store_new(2, 
              G_TYPE_STRING, 
              G_TYPE_STRING); 

    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(items)); 
    gtk_tree_view_insert_column_with_attributes 
    (GTK_TREE_VIEW(view), 
    0, 
    "Herp", 
    gtk_cell_renderer_text_new(), 
    "text",0, 
    NULL); 
    gtk_tree_view_insert_column_with_attributes 
    (GTK_TREE_VIEW(view), 
    1, 
    "Derp", 
    gtk_cell_renderer_text_new(), 
    "text",1, 
    NULL); 
    gtk_container_add(GTK_CONTAINER(top),view); 
    GtkCssProvider* prov = gtk_css_provider_new(); 
    gtk_css_provider_load_from_path 
    (prov, 
    "derp.css", 
    NULL); 
    gtk_style_context_add_provider 
    (gtk_widget_get_style_context(view), 
    GTK_STYLE_PROVIDER(prov), 
    GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); 

    GtkTreeIter iter; 
    gtk_tree_model_get_iter_first(GTK_TREE_MODEL(items),&iter); 

    for(i=0;i<3;++i) { 
    gtk_list_store_insert_with_values 
     (items,&iter,0, 
     0, "Row", 
     1, "Row", 
     -1); 
    } 
    gtk_widget_show_all(top); 
    gtk_main(); 
    return 0; 
} 

編譯:

gcc -o test teststyle.c `pkg-config gtk+-3.0 --cflags --libs` 

當我運行應用程序時,三排#00FFFF作爲背景色顯示。他們不交替。它們只採用「行:第n個孩子(奇數)」部分的顏色,甚至偶數行也採用該顏色。亂七八糟的CSS文件也可以做一些有趣的事情。開關奇數和偶數,例如:

GtkTreeView row { 
    color: #FFFFFF; 
    background-color: #FF0000; 
} 
GtkTreeView row:nth-child(odd) { 
    background-color: #FF00FF; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #00FFFF; 
} 

現在所有的行顯示爲#FF00FF,沒有交替。我認爲GTK完全不能讀取僞類,不小心把「GtkTreeView行:nth-​​child(odd)」變成了「GtkTreeView行」,完全錯過了「n-child(even)」選擇器。如果我刪除奇選擇,只有甚至有:

GtkTreeView row { 
    color: #FFFFFF; 
    background-color: #FF0000; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #FF00FF; 
} 

現在,它得到了#FF0000背景顏色,所以它忽略(偶數)全部規則。

我試着在樹視圖中設置規則提示,除了抱怨設置規則提示已被棄用之外,它沒有做任何事情。我在基本的Arch系統上使用GTK 3.18.9,XFCE作爲窗口管理器。我在這裏做錯了什麼?或者,我的GTK版本不知怎麼搞亂了?

回答

1

我想只有2塊是夠像這些

GtkTreeView row:nth-child(odd) { 
    background-color: #FF00FF; 
} 
GtkTreeView row:nth-child(even) { 
    background-color: #00FFFF; 
} 

低於蟒蛇的例子,答案

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

window = Gtk.Window() 
window.connect("destroy", lambda q: Gtk.main_quit()) 

liststore = Gtk.ListStore(str, int) 
liststore.append(["Oranges", 5]) 
liststore.append(["Apples", 3]) 
liststore.append(["Bananas", 1]) 
liststore.append(["Tomatoes", 4]) 
liststore.append(["Cucumber", 1]) 
liststore.append(["potatoes", 10]) 
liststore.append(["apricot", 100]) 

treeview = Gtk.TreeView(model=liststore) 
treeview.set_rules_hint(True) 
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 = """ 
       /* font operate on entire GtkTreeView not for selected row */ 
       GtkTreeView {font-weight: bold;font: Sans 20;font-style: italic;} 
       GtkTreeView row:nth-child(even) { 
       background-image: -gtk-gradient (linear, 
                left top, 
        left bottom, 
        from (#d0e4f7), 
        color-stop (0.5, darker (#d0e4f7)), 
        to (#fdffff)); 
       } 
       GtkTreeView row:nth-child(odd) { 
       background-image: -gtk-gradient (linear, 
                left top, 
        left bottom, 
        from (yellow), 
        color-stop (0.5, darker (yellow)), 
        to (#fdffff)); 
       } 
       /* next line only border action operate */ 
       GtkTreeView:selected{color: white; background: green; border-width: 1px; border-color: black;} 
       /* next line for Gtk.TreeViewColumn */ 
       column-header .button{color: white; background: purple;} 

      """ 
css_provider.load_from_data(css) 
screen = Gdk.Screen.get_default() 
style_context = window.get_style_context() 
style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) 

window.show_all() 

Gtk.main() 
+0

代碼示例前測試OK不起作用「回溯(最近通話最後一個) :文件「zebragtk.py」,第58行,在 css_provider.load_from_data(css) TypeError:項目0:必須是數字,而不是str「 – Sam

+0

我有點驚訝。我的gtk是版本GtK 3.8.10和python是2.7.6。代碼運行正常。我不知道是什麼。有沒有人可以解釋它? – Manmax

+0

我正在使用GTK 3.18.2。聽起來熟悉的set_rules_hint在GTK 3.14中被折舊了https://developer.gnome.org/gtk3/3.16/GtkTreeView.html#gtk-tree-view-set-rules-hint – Sam