Pygtk:如何更改一行的树顶颜色?

Pygtk:如何更改一行的树顶颜色?,pygtk,Pygtk,目前,我正在使用Python和Gtk+库开发一个工具。我在这里遇到了一个$subject的问题。有没有什么有效的方法可以将树顶“1/8”的背景色改为红色?如下图所示: 我使用treestore.set_值来更改它,但不幸的是它对我不起作用,它只能更改treestore的值 不知道,所以我在这里提出一个问题。 有人能注意一下吗?任何建议都将不胜感激。您可以使用pygtk2.0中关于方法的文档,并阅读pygtk2.0的重要页面和特殊属性,这在PyGTK的第3版中也很有用:) 下面的代码可以帮助您:

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

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

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

您可以使用pygtk2.0中关于方法的文档,并阅读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()
#/usr/bin/env python
尝试:
进口pygtk;pygtk.require('2.0')
除:
通过
进口gtk
进口盘古
COL_FIRST_NAME=0
COL_LAST_NAME=1
COL_YEAR_BORN=2
颜色=3
类树示例:
def createAndFillModel(自):
treestore=gtk.treestore(str,str,str,str)
toplevel1=treestore.append(无)
toplevel2=treestore.append(无)
child=treestore.append(toplevel2)
pre_child=treestore.append(child)
树=[(顶层1,
上校的名字,“玛丽亚”,
上校姓“隐姓埋名”,
COL_YEAR_BORN,1982年,
颜色“黑色”),
(顶级2,
上校的名字,“简”,
上校姓“平均”,
上校出生于1962年,
颜色“黑色”),
(儿童,
上校的名字叫“贾尼塔”,
上校姓“平均”,
COL_YEAR_BORN,1985年,
颜色“黑色”),
(学前儿童,
上校的名字,“ABC”,
上校姓“DEF”,
颜色(“黑色”)
]
现在的年份=2015年
对于树中的项目:
iter=项目[0]
treestore.set(*项)
如果项目[5]==颜色:
treestore.设定值(iter,列年出生,“年龄未知”)
对于范围(1,len(treestore.get_path(iter))+1)内的x:
niter=treestore.get_iter(treestore.get_路径(iter)[:x])
treestore.设置值(硝石、颜色、“红色”)
其他:
treestore.set_值(国际热核实验堆、COL_YEAR_BORN、YEAR_now-项目[6])
返回树顶
def AGECELLDATAFNC(自身、列、渲染器、模型、iter、数据):
现在的年份=2015年
出生年份=型号。获取数值(国际热核实验堆,COL出生年份)

如果是year_born和year_born,我以前读过,但不幸的是它对我不起作用。例如,在父树存储中,我已经设置了文本和背景,在子树存储中,我认为它不能更改父树存储的背景。它只能修改当前树存储行渲染器的属性。无法更改父树存储行的属性,例如:background。必须存储目标行的所有祖先路径,以便在着色行中使用。着色父项不会自动修改,但您可以使用'ListStore'的
get_path
方法获取行的父项。感谢您的回复,我使用treestore而不是ListStore,您的意思是使用CellRenderText.set_属性设置父项属性?例如:cell.set_属性(“前台”、“红色”),但cell在当前行上工作,无法设置父行。