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

如何让Gtk.TreeView显示计算后的单元格内容

在Gtk 3.0中为TreeView单元格自定义SI后缀格式(不修改原ListStore)

你完全不需要修改原有的ListStore或者新增额外的计算列来实现这个需求!Gtk的CellRendererText提供了一个非常实用的func属性,允许我们在渲染单元格的时候动态转换原始数据的显示格式,完全不会影响到ListStore里的原始值。

下面是完整的可运行示例代码:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

def format_with_si_suffix(value):
    """将整数转换为带SI后缀的可读字符串"""
    suffixes = ['', 'k', 'M', 'B', 'T']
    magnitude = 0
    # 处理数值量级,转换到合适的后缀区间
    while abs(value) >= 1000 and magnitude < len(suffixes) - 1:
        value /= 1000.0
        magnitude += 1
    # 根据数值大小调整显示精度
    if magnitude == 0:
        return f"{int(value)}"
    elif value >= 10:
        return f"{int(value)}{suffixes[magnitude]}"
    else:
        return f"{value:.1f}{suffixes[magnitude]}"

def cell_render_func(cell_layout, cell, tree_model, tree_iter, data):
    """自定义单元格渲染回调函数"""
    # 从ListStore中取出原始整数值
    original_value = tree_model.get_value(tree_iter, 0)
    # 转换为带SI后缀的显示文本
    display_text = format_with_si_suffix(original_value)
    # 设置单元格要显示的内容
    cell.set_property('text', display_text)

class MainWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="SI后缀格式化示例")
        self.set_default_size(200, 300)

        # 创建仅存储整数的原始ListStore
        self.liststore = Gtk.ListStore(int)
        # 添加测试数据
        test_values = [500, 1300, 2500000, 987654321, 1234567890123]
        for val in test_values:
            self.liststore.append([val])

        # 创建TreeView并关联ListStore
        self.treeview = Gtk.TreeView(model=self.liststore)

        # 创建单元格渲染器,不直接绑定ListStore列
        renderer = Gtk.CellRendererText()
        # 将自定义渲染函数绑定到列上
        column = Gtk.TreeViewColumn("格式化数值", renderer)
        column.set_cell_data_func(renderer, cell_render_func)

        # 将列添加到TreeView
        self.treeview.append_column(column)

        # 用滚动窗口承载TreeView
        scrolled_window = Gtk.ScrolledWindow()
        scrolled_window.add(self.treeview)
        self.add(scrolled_window)

win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

关键逻辑说明

  1. 格式化函数:format_with_si_suffix负责把原始整数转换成带SI后缀的字符串,你可以根据需求调整小数位数、后缀类型(比如新增G、P等)。
  2. 渲染回调:cell_render_func是Gtk触发渲染时的回调,这里我们从ListStore获取原始值,转换后再设置给单元格显示,完全不改动原始数据。
  3. 列的绑定方式:没有用add_attribute直接关联ListStore的列,而是用set_cell_data_func绑定自定义函数,实现了数据存储和显示逻辑的分离。

这种方式的优势在于,ListStore里的原始整数数据完全不受影响,所有格式转换仅发生在渲染阶段,既满足了显示需求,也保留了原始数据的可用性。

内容的提问来源于stack exchange,提问作者stefan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:20