我想通过使(行中某一列的)文本为粗体或以粗体显示行的已读或未读状态。
行的状态(或模型中的数据)可以是模型的一部分或其他位置。我现在很灵活。
如何根据基础(动态)数据(在此示例中为值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()
最佳答案
与Gtk维护人员简短讨论之后,我发现还有另一种更清洁的方式可以做到这一点。由于两个答案都有效,因此我决定将其作为单独的答案。
另一个答案的问题是cell_data_func
被每一行调用。随着时间的流逝,如果您有很多行,它将变得非常缓慢。
此处的解决方案是在模型中添加另一列,然后将其绑定到相关属性。
当前,您执行以下操作:
col = Gtk.TreeViewColumn(
'Text', renderer, text=0, weight_set=True)
这会将
text
的CellRenderer
属性绑定到模型的第0列。现在,我们也可以将其绑定到任何其他属性。例如,将列1绑定到
weight
属性:col = Gtk.TreeViewColumn(
'Text', renderer, text=0, weight=1, weight_set=True)
然后,您可以将此列设置为不同的
Pango.Weight
值以更改文本的粗细。class Model(Gtk.ListStore):
def __init__(self):
...
self.append(['foo 1', Pango.Weight.BOLD])
self.append(['foo 2', Pango.Weight.BOOK])
...
如果您要设置其他属性,则还可以设置
markup
属性(将字符串解析为pango标记,并允许您更改文本某些部分的字体,颜色等)和attributes
属性,您可以使用pango.AttrList类型一次设置多个样式属性。