Как ограничить количество десятичных знаков, отображаемых в Gtk CellRendererText

Я пытаюсь ограничить количество десятичных знаков, отображаемых в 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()

person tobias47n9e    schedule 28.12.2014    source источник
comment
Отформатируйте поплавок в строку.   -  person simonzack    schedule 28.12.2014
comment
@simonzack - я знаю, что это тоже работает. Действительно ли CellRenderer не имеет возможности форматирования чисел? Если это так, я бы тоже принял это как ответ.   -  person tobias47n9e    schedule 28.12.2014


Ответы (3)


Споткнулся о ту же проблему. В основном то, что вы хотите сделать, это использовать set_cell_data_func вашего GtkTreeViewColumn для установки функции рендеринга, которая изменяет свойство «текст» ячейки. Что касается вашего примера, попробуйте добавить строку:

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

Рекомендации:

person lyngvi    schedule 30.01.2015
comment
Теперь я использую форматирование строк для всех своих древовидных представлений, но это тоже выглядит хорошим решением. - person tobias47n9e; 30.01.2015
comment
Это довольно хорошее решение, хотя было бы лучше, если бы вы могли использовать лямбда-функцию более широко. поэтому вместо этого: model.get(iter, 0). Было бы неплохо иметь возможность просто определить значение индекса: model.get(iter, index). Я не мог понять, как это сделать. - person Taylor Ramirez; 28.03.2019

Основываясь на вышеизложенном для 2-значного рендерера денег. Мы передаем индекс списка text=3 как 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)
person Zren    schedule 20.04.2018

Благодаря 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)
person tobias47n9e    schedule 09.02.2015