How to limit number of decimal places to be displayed in Gtk CellRendererText

前提是你 提交于 2019-12-09 23:14:14

问题


I am trying to limit the amount of decimal places shown in a Gtk.CellRendererText. Currently a float number field is shown with 6 decimal places, but I would like to have just 1.

This test code should work on 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()

回答1:


Tripped over the same problem. Basically what you want to do is use your GtkTreeViewColumn's set_cell_data_func to set the rendering function, which changes the 'text' property of the cell. In terms of your example, try adding the line:

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

References:

  • gtk.TreeViewColumn: https://developer.gnome.org/pygtk/stable/class-gtktreeviewcolumn.html



回答2:


Building on the above for a 2 digit Money renderer. We pass the text=3 liststore index as the func_data (it's the unused parameter lyngvi used).

I'm not certain how to read the "digits" property from the cell renderer yet to make this code reuseable for any number of digits, but this works for money. I might refactor it for generic string formatting too.

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)



回答3:


Thanks to lyngvi I am now using this slightly modified code to round and truncate the values in the treeview to one decimal place:

    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)


来源:https://stackoverflow.com/questions/27675919/how-to-limit-number-of-decimal-places-to-be-displayed-in-gtk-cellrenderertext

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!