我试图限制Gtk.CellRendererText中显示的小数位数。目前浮点数字段显示有6个小数位,但我想只有1个。
此测试代码应适用于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()
答案 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)。
我不确定如何阅读"数字"来自单元格渲染器的属性还要使此代码可以重复使用任意数量的数字,但这适用于金钱。我也可以将它重构为通用字符串格式。
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)