如何限制在Gtk CellRendererText中显示的小数位数

时间:2014-12-28 11:19:46

标签: gtk3 pygobject cellrenderer

我试图限制Gtk.CellRendererText中显示的小数位数。目前浮点数字段显示有6个小数位,但我想只有1个。

enter image description here

此测试代码应适用于Linux:

#!/usr/bin/python3
from gi.repository import Gtk

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")
        self.set_default_size(200, 200)

        self.liststore = Gtk.ListStore(float)
        treeview = Gtk.TreeView(model=self.liststore)

        self.liststore.append([9.9])
        self.liststore.append([1])

        xrenderer = Gtk.CellRendererText()
        xrenderer.set_property("editable", True)
        xcolumn = Gtk.TreeViewColumn("Float Numbers", xrenderer, text=0)
        xcolumn.set_min_width(100)
        xcolumn.set_alignment(0.5)
        treeview.append_column(xcolumn)

        self.add(treeview)

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

3 个答案:

答案 0 :(得分:4)

绊倒了同样的问题。基本上你想要做的是使用你的GtkTreeViewColumn的set_cell_data_func来设置渲染函数,它改变了单元格的'text'属性。就您的示例而言,请尝试添加以下行:

xcolumn.set_cell_data_func(xrenderer, \
    lambda col, cell, model, iter, unused:
        cell.set_property("text", "%g" % model.get(iter, 0)[0]))

参考文献:

答案 1 :(得分:1)

以2位数的Money渲染器为基础构建。我们将text=3 liststore索引作为func_data传递(它使用的是unused参数lyngvi)。

我不确定如何阅读"数字"来自单元格渲染器的属性还要使此代码可以重复使用任意数量的数字,但这适用于金钱。我也可以将它重构为通用字符串格式。

https://developer.gnome.org/pygtk/stable/class-gtktreeviewcolumn.html#method-gtktreeviewcolumn--set-cell-data-func

class MoneyCellRenderer(Gtk.CellRendererSpin):
    def __init__(self):
        super().__init__()
        self.set_property("editable", True)
        self.set_property("digits", 2)
        adjustment = Gtk.Adjustment(0, 0, sys.maxsize, 0.01, 1.00, 1.00)
        self.set_property("adjustment", adjustment)

# Only show 2 digits
# https://stackoverflow.com/questions/27675919/how-to-limit-number-of-decimal-places-to-be-displayed-in-gtk-cellrenderertext
# https://developer.gnome.org/pygtk/stable/class-gtktreeviewcolumn.html#method-gtktreeviewcolumn--set-cell-data-func
def moneyCellDataFunc(treeViewColumn, cellRenderer, model, iter, column):
    val = model.get(iter, column)
    val = val[0]
    val = "{:.2f}".format(val) # TODO get cell_rendere.digits
    return cellRenderer.set_property("text", val)

class MoneyTreeViewColumn(Gtk.TreeViewColumn):
    def __init__(self, title, cell_renderer, text=0):
        super().__init__(title, cell_renderer, text=text)
        self.set_cell_data_func(cell_renderer, moneyCellDataFunc, text)

答案 2 :(得分:0)

感谢lyngvi我现在使用这个稍微修改过的代码将树视图中的值舍入并截断为一个小数位:

    def truncate(self, number):
        """
        Rounds and truncates a number to one decimal place. Used for all
        float numbers in the data-view. The numbers are saved with full float
        precision.
        """
        number = round(number, 1)
        return number

    renderer_dir = Gtk.CellRendererText()
    renderer_dir.set_property("editable", True)
    column_dir = Gtk.TreeViewColumn("Dir", renderer_dir, text=0)
    column_dir.set_alignment(0.5)
    column_dir.set_expand(True)
    column_dir.set_cell_data_func(renderer_dir, \
                lambda col, cell, model, iter, unused:
                cell.set_property("text",
                "{0}".format(self.truncate(model.get(iter, 0)[0]))))
    self.append_column(column_dir)