【问题标题】:Pygtk: How do I change the treestore color of a row?Pygtk:如何更改行的树存储颜色?
【发布时间】:2015-01-29 19:23:21
【问题描述】:

目前我正在使用 Python 和 Gtk+ 库开发一个工具。我在这里遇到了 $subject 的问题。是否有任何有效的方法可以将树库“1/8”的背景颜色更改为红色?如下图所示:

http://imagebin.ca/v/1pZgJ61cWi9D

我使用 treestore.set_value 来更改它,但不幸的是它对我不起作用,它只能更改 treestore 的值。

不知道,所以我在这里提出一个问题。 有人可以关注一下吗?任何建议将不胜感激。

【问题讨论】:

    标签: pygtk


    【解决方案1】:

    您可以使用 pygtk2.0 的有关 TreeViewColumn.set_cell_data_func 方法的文档并阅读有关 CellRenderers 和 PyGTK2.0 的特殊属性的重要页面,这在 PyGTK 的版本 3 上也很有用:)

    下面的代码可以帮助你:

    #!/usr/bin/env python
    
    try:
        import pygtk; pygtk.require('2.0')
    except:
        pass
    import gtk
    import pango
    
    COL_FIRST_NAME = 0
    COL_LAST_NAME = 1
    COL_YEAR_BORN = 2
    COL_COLOR = 3
    
    class TreeStoreExample:
    
        def createAndFillModel(self):
    
            treestore = gtk.TreeStore(str, str, str, str)
            toplevel1 = treestore.append(None)
            toplevel2 = treestore.append(None)
            child = treestore.append(toplevel2)
            pre_child = treestore.append(child)
    
            tree = [(toplevel1,
                          COL_FIRST_NAME, "Maria",
                          COL_LAST_NAME, "Incognito",
                          COL_YEAR_BORN, 1982,
                          COL_COLOR, 'black'),
    
                    (toplevel2,
                          COL_FIRST_NAME, "Jane",
                          COL_LAST_NAME, "Average",
                          COL_YEAR_BORN, 1962,
                          COL_COLOR, 'black'),
    
                    (child,
                          COL_FIRST_NAME, "Janinita",
                          COL_LAST_NAME, "Average",
                          COL_YEAR_BORN, 1985,
                          COL_COLOR, 'black'),
    
                    (pre_child,
                          COL_FIRST_NAME, "ABC",
                          COL_LAST_NAME, "DEF",
    
                          COL_COLOR, 'black')
            ]
    
            year_now = 2015
            for item in tree:
                iter = item[0]
                treestore.set(*item)
                if item[5] == COL_COLOR:
                    treestore.set_value(iter, COL_YEAR_BORN, "age unknown")
                    for x in range(1, len(treestore.get_path(iter)) + 1):
                        niter = treestore.get_iter(treestore.get_path(iter)[:x])
                        treestore.set_value(niter, COL_COLOR, "red")
                else:
                    treestore.set_value(iter, COL_YEAR_BORN, year_now - item[6])
    
            return treestore
    
        def ageCellDataFunc(self, column, renderer, model, iter, data):
    
            year_now = 2015
            year_born = model.get_value(iter, COL_YEAR_BORN)
    
            if year_born and year_born <= year_now:
                age = year_now - year_born
                buf = "%u years old" % age
                renderer.set_property("foreground-set", gtk.FALSE)
            else:
                buf = "age unknown"
                #renderer.set_property("foreground", "red")
                model.set_value(iter, COL_COLOR, "red")
                for x in range(1, len(model.get_path(iter))):
                    niter = model.get_iter(model.get_path(iter)[:x])
                    node = model.set_value(niter, COL_COLOR, "red")
                    print model.get_path(iter)[:x], ":", model.get_value(niter, COL_COLOR)
    
            #renderer.set_property("text", buf)
    
        def createViewAndModel(self):
    
            view = gtk.TreeView(self.createAndFillModel())
            self.view = view
            # --- Column 1 ---
            column = gtk.TreeViewColumn()
            column.set_title("First Name")
            view.append_column(column)
            renderer = gtk.CellRendererText()
            column.pack_start(renderer, gtk.TRUE)
            column.add_attribute(renderer, "text", COL_FIRST_NAME)
    
            # --- Column 2 ---
            column = gtk.TreeViewColumn()
            column.set_title("Last Name")
            view.append_column(column)
            renderer = gtk.CellRendererText()
            column.pack_start(renderer, gtk.TRUE)
            column.add_attribute(renderer, "text", COL_LAST_NAME)
            renderer.set_property("weight", pango.WEIGHT_BOLD)
    
            # --- Column 3 ---
            renderer = gtk.CellRendererText()
            renderer.set_property('foreground-set',True)
            column = gtk.TreeViewColumn("age", renderer, foreground=COL_COLOR)
            column.pack_start(renderer, gtk.TRUE)
            column.add_attribute(renderer, "text", COL_YEAR_BORN)
            column.add_attribute(renderer, "foreground", COL_COLOR)
            #column.set_title("age")
            view.append_column(column)
            #column.set_cell_data_func(renderer, self.ageCellDataFunc, None)
    
            #model = self.createAndFillModel()
    
            #view.set_model(model)
    
            view.get_selection().set_mode(gtk.SELECTION_NONE)
    
            return view
    
        def __init__(self):
    
            window = gtk.Window(gtk.WINDOW_TOPLEVEL)
            window.connect("delete_event", gtk.mainquit)
    
            view = self.createViewAndModel()
            window.add(view)
    
            window.show_all()
    
    def main():
        gtk.main()
        return 0
    
    if __name__ == "__main__":
        TreeStoreExample()
        main()
    

    ageCellDataFunc 方法未运行,因为如果设置 set_cell_data_func,则 add_attribute 方法未运行。

    【讨论】:

    • 我以前读过它,但不幸的是它对我不起作用。例如,在父树库中我已经设置了文本和背景,在子树库中我认为它不会改变父树库的背景。
    • 它只能修改当前treestore行渲染器的属性。无法更改父树存储行的属性,例如:背景。
    • 您必须存储目标行的所有祖先路径以用于着色行。着色父母不会自动修改,但您可以使用 `ListStore' 的get_path 方法来获取行的父母。
    • 谢谢你的回复,我用的是treestore而不是liststore,你的意思是用CellRendererText.set_property来设置父母的属性?如:cell.set_property("foreground", "red"),但是cell作用于当前行,无法设置父行。
    猜你喜欢
    • 2016-03-07
    • 2012-02-20
    • 1970-01-01
    • 2011-10-30
    • 2016-04-29
    • 2016-04-29
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多