Отображение данных столбца Python Gtk TreeView - PullRequest
0 голосов
/ 14 октября 2018

Я использую код, найденный здесь:

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

в течение нескольких лет для форматирования Treeviewномер столбца.Но когда я вставляю столбцы, используя цикл, столбцы отображают данные из первого столбца, а не данные, которые я ожидаю получить из ListStore.Почему это?Я боролся с этим в течение некоторого времени, и это, вероятно, действительно простое решение, но я довольно невежественен !!Большое спасибо.Вот рабочий пример, который показывает мою проблему:

from gi.repository import Gtk, Gdk
class myClass:
    def __init__(self):
    # Setup
        self.iListstore = Gtk.ListStore(str, float, float, float, float)
        self.iListstore.append(['abc',209.8967,568.56432, 1, 2])
        self.iListstore.append(['def',2409.846,559.534, 3, 4])
        self.window = Gtk.Window()
        self.iTreeView = Gtk.TreeView(self.iListstore)
    # Column 0
        lblr= Gtk.CellRendererText()
        lcol = Gtk.TreeViewColumn('Row Label')
        self.iTreeView.append_column(lcol)
        lcol.pack_start(lblr, True)
        lcol.add_attribute(lblr, 'text',0)
    # Column 1
        cr = Gtk.CellRendererText(xalign=1)
        myCol = Gtk.TreeViewColumn('Col1')
        myCol.set_sort_column_id(1)
        self.iTreeView.append_column(myCol)
        myCol.pack_start(cr, True)
        myCol.add_attribute(cr, 'text',1)
        myCol.set_cell_data_func(cr,lambda column, cell, model, iter, unused:cell.set_property("text","{0:.2f}".format(round(model.get(iter,1)[0],2))))
    # Column 2
        myCol = Gtk.TreeViewColumn('Col2')
        myCol.set_sort_column_id(2)
        self.iTreeView.append_column(myCol)
        myCol.pack_start(cr, True)
        myCol.add_attribute(cr, 'text',2)
        myCol.set_cell_data_func(cr,lambda column, cell, model, iter, unused:cell.set_property("text","{0:.2f}".format(round(model.get(iter,2)[0],2))))
# The above works but the following does not. Col3 has the same value as Col4. Can someone tell me the reason a loop can not be used with the code?
        colNames=['Col3','Col4']
        for i in range(3,5):
            myCol = Gtk.TreeViewColumn(colNames[i-3]) # I realize this is a bit of a fudge 
            myCol.set_sort_column_id(i)
            self.iTreeView.append_column(myCol)
            myCol.pack_start(cr, True)
            myCol.add_attribute(cr, 'text',i)
            myCol.set_cell_data_func(cr,lambda column, cell, model, iter, unused:cell.set_property("text","{0:.2f}".format(round(model.get(iter,i)[0],2))))
    # Window
            self.window.add(self.iTreeView)
            self.window.show_all()

    def main(self):
        Gtk.main()

    p=myClass()
    p.main()

1 Ответ

0 голосов
/ 18 октября 2018

Я действительно пытался заставить лямбда-функцию работать по ссылкам Libeforce (спасибо еще раз!), Но не смог ее решить.В соответствии с Что (лямбда-функции) фиксируют закрытия функций? , «Хитрость в том, чтобы помнить, что циклы не создают новую область видимости», поэтому следующий столбец никогда не изменяется.Я сломал функцию, и код теперь работает:

from gi.repository import Gtk, Gdk
import  inspect

class myClass:
    def __init__(self):
    # Setup
        self.iListstore = Gtk.ListStore(str, float, float, float, float)
        self.iListstore.append(['abc',209.8967,568.56432, 1, 2])
        self.iListstore.append(['def',2409.846,559.534, 3, 4])
        self.window = Gtk.Window()
        self.iTreeView = Gtk.TreeView(self.iListstore)
        self.window.add(self.iTreeView) # moved to avoid an error of adding TreeView twice to Window
    # Column 0
        lblr= Gtk.CellRendererText()
        lcol = Gtk.TreeViewColumn('Row Label')
        self.iTreeView.append_column(lcol)
        lcol.pack_start(lblr, True)
        lcol.add_attribute(lblr, 'text',0)
    # Column 1
        cr = Gtk.CellRendererText(xalign=1)
        myCol = Gtk.TreeViewColumn('Col1')
        myCol.set_sort_column_id(1)
        self.iTreeView.append_column(myCol)
        myCol.pack_start(cr, True)
        myCol.add_attribute(cr, 'text',1)
        myCol.set_cell_data_func(cr,lambda column, cell, model, iter, unused:cell.set_property("text","{0:.2f}".format(round(model.get(iter,1)[0],2))))
    # Column 2
        myCol = Gtk.TreeViewColumn('Col2')
        myCol.set_sort_column_id(2)
        self.iTreeView.append_column(myCol)
        myCol.pack_start(cr, True)
        myCol.add_attribute(cr, 'text',2)
        myCol.set_cell_data_func(cr,lambda column, cell, model, iter, unused:cell.set_property("text","{0:.2f}".format(round(model.get(iter,2)[0],2))))
# The above works and the following now works. Could not figure out how to use lambda properly so broke the function out into roundCell
        colNames=['Col3','Col4']
        for i in range(3,5):
            myCol = Gtk.TreeViewColumn(colNames[i-3])
            myCol.set_sort_column_id(i)
            self.iTreeView.append_column(myCol)
            myCol.pack_start(cr, True)
            myCol.add_attribute(cr, 'text',i)
            myCol.set_cell_data_func(cr, self.roundCell,i)
    # Window
            self.window.show_all()

    def roundCell(self, col, myCell, mdl, itr,i):
        # col =Columnn, myCell = Cell, mdl = model, itr = inter, i = column number
        # We don't use column, but it is provided by the function
        myCell.set_property("text","{0:.2f}".format(round(mdl.get(itr,i)[0],2)))

    def main(self):
        Gtk.main()

p=myClass()
p.main()
...