You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:51:59