在 Gtk.TreeView 中只加粗一些行

buh*_*htz 2 python pygobject python-3.x gtk3

我想通过将文本(行中列的)加粗或不加粗来显示行的已或未状态。

行的状态(或模型中的数据)可以是模型的一部分或其他地方。在这一点上,我很灵活。

如何根据基础(动态)数据将特定单元格的文本设为粗体,在本例中为值1

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class View(Gtk.TreeView):
    def __init__(self, model):
        Gtk.TreeView.__init__(self, model)
        col = Gtk.TreeViewColumn('Text',
                                 Gtk.CellRendererText(),
                                 text=0)
        self.append_column(col)
        # bold text
        # Gtk.CellRendererText(weight_set=True, weight=700),


class Model(Gtk.ListStore):
    def __init__(self):
        Gtk.ListStore.__init__(self, str, int)
        self.append(['foo 1', 0])
        self.append(['foo 2', 1])  # bold
        self.append(['foo 3', 0])
        self.append(['foo 4', 0])
        self.append(['foo 5', 1])  # bold

class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_default_size(100, 200)

        # model & view
        self.model = Model()
        self.view = View(self.model)

        # layout
        self.layout = Gtk.Grid()
        self.add(self.layout)
        self.layout.attach(self.view, 0, 0, 1, 2)

        self.connect('destroy', Gtk.main_quit)
        self.show_all()

if __name__ == '__main__':
    win = Window()
    Gtk.main()
Run Code Online (Sandbox Code Playgroud)

Azs*_*sgy 5

就像在 Gtk 中一样,这非常非常简单,只是不是很明显。您确实需要知道在哪里查看并仔细阅读相关文档。

class View(Gtk.TreeView):
    def __init__(self, model):
        Gtk.TreeView.__init__(self, model)
        renderer = Gtk.CellRendererText()
        col = Gtk.TreeViewColumn(
            'Text', renderer, text=0, weight_set=True)
        col.set_cell_data_func(renderer, datafunc)
        self.append_column(col)
Run Code Online (Sandbox Code Playgroud)

第一个关键是TreeViewColumn.set_cell_data_func 方法。这允许您设置一个拦截函数,您可以使用该函数在呈现之前修改单元格的属性。这是我写的一个示例,它可以满足您的需求:

def datafunc(col, renderer, model, titer, data):
    val = model.get_value(titer, 1)

    if val:
        renderer.set_property("weight", 700)
Run Code Online (Sandbox Code Playgroud)

如您所见,它接收TreeViewColumnCellRendererTreeModel和所TreeIter涉及的以及自定义数据,我已经省略了这些数据。

第一步是获取当前列的值。为此,我们为模型提供了 treeiter(它保存了“当前行”,有点)和我们想要的列 id(在本例中为第二列1)。

剩下的很简单,我们使用该值来决定是否需要在 CellRenderer 上设置“权重”属性。

您在这里使用了 700,但Pango.Weight.BOLD为了清楚起见,我建议您改为使用。这from gi.repository import Pango当然需要。