如何在Gtk.TreeView中根据动态数据设置指定单元格文本加粗?
实现Gtk TreeView根据动态数据设置单元格文本加粗(标记已读/未读)
我来帮你完成这个需求,下面是一个完整的可运行示例,基于Gtk 3.0实现根据底层动态数据(比如示例中的值1)将指定单元格文本设置为加粗的效果,以此标记行的已读/未读状态:
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') gi.require_version('Pango', '1.0') from gi.repository import Gtk, Pango class ReadUnreadTreeView(Gtk.TreeView): def __init__(self): super().__init__() # 1. 创建数据模型:包含状态列(1=未读,0=已读)和内容列 self.list_store = Gtk.ListStore(int, str) # 示例数据:模拟动态加载的内容,包含已读和未读状态 self.list_store.append([1, "未读消息:新的系统通知"]) self.list_store.append([0, "已读消息:账户密码修改成功"]) self.list_store.append([1, "未读消息:您的订单已发货"]) self.list_store.append([0, "已读消息:月度账单已生成"]) self.set_model(self.list_store) # 2. 创建列和单元格渲染器 # 内容列 renderer_text = Gtk.CellRendererText() column = Gtk.TreeViewColumn("消息内容", renderer_text, text=1) # 3. 设置动态渲染函数:根据状态列的值调整文本加粗 def cell_data_func(column, cell, model, iter, data): # 获取当前行的状态值 status = model.get_value(iter, 0) # 根据状态设置字体权重:1=未读(加粗),0=已读(普通) if status == 1: cell.set_property("weight", Pango.Weight.BOLD) else: cell.set_property("weight", Pango.Weight.NORMAL) column.set_cell_data_func(renderer_text, cell_data_func) self.append_column(column) # 创建主窗口并运行 class MainWindow(Gtk.Window): def __init__(self): super().__init__(title="已读/未读消息标记") self.set_default_size(400, 300) tree_view = ReadUnreadTreeView() scrolled_window = Gtk.ScrolledWindow() scrolled_window.add(tree_view) self.add(scrolled_window) self.connect("destroy", Gtk.main_quit) if __name__ == "__main__": win = MainWindow() win.show_all() Gtk.main()
关键部分解释:
- 数据模型设计:我们用
Gtk.ListStore存储每行的状态(整数类型)和显示内容,状态值可以从后端接口、数据库或其他数据源动态获取 - 动态渲染函数:通过
set_cell_data_func给单元格渲染器绑定一个自定义函数,这个函数会在每行渲染时被调用,我们可以在这里根据行数据修改渲染属性 - 字体权重设置:借助
Pango.Weight枚举值,将未读状态(值为1)的文本设置为加粗,已读状态(值为0)的文本保持普通样式
扩展说明:
- 如果你的状态数据存储在模型的其他列,只需要修改
model.get_value(iter, 0)中的列索引即可 - 你也可以把状态存储在模型之外(比如单独的字典或数据库),只需要在
cell_data_func中根据当前行的标识(比如ID)获取对应状态值
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

