1

我编写了以下 python 程序来从列表中选择可变数量的形状(n=3,8,5),并在选择三个不同的键时制作并显示一个带有(n+1=4,9,6)的表从组合框下拉列表中。问题是表列的数量不会随所选键而改变,并且在其初始设置中是固定的,但表内容会针对这些固定列进行更新。您对显示可变长度表的建议是非常感激。

from traits.api import HasTraits, Instance, List, Str 
from traitsui.api import Item, View, VGroup, EnumEditor,TableEditor, ObjectColumn

keys = ["key1", "key2", "key3"]
ph_dict={}
ph_dict["key1"] = ["A1","A2","A3"]
ph_dict["key2"] = ["B1", "B2", "B3", "B4",  "B5", "B6", "B7", "B8"]
ph_dict["key3"] = ["C1", "C2","C3", "C4", "C5"]

shapes = ["square", "circle","inverted_triangle", "diamond", "dot", "cross", "plus",       
"pixel"] 


class ShapeTable(HasTraits):
    pass


class DynamicTable(HasTraits):

    Shape = Str
    Shapedropdownlist = List(Str)
    shapes_name = List(Str)

    shape_table = List(Instance(ShapeTable))
    shape_columns = [ObjectColumn(name="Name")]
    shape_columns.append(ObjectColumn(name="Value"))    
    shape_table_editor=TableEditor(columns=shape_columns,
        deletable = True,
        sortable = False,
        sort_model = False,
        show_lines = True,
        line_color = "black",
        editable= False,
        show_column_labels = False)

    traits_view = View(VGroup(
                      Item('Shape',editor=EnumEditor(name='Shapedropdownlist',),),
                      Item( 'shape_table',editor=shape_table_editor,show_label=False,
                             width=0.3, padding=0)),

                       width=500, height=200, resizable=True,
                       title = "Dynamic table trait"
                       )


    def __init__(self):
        super(DynamicTable, self).__init__()

        self.shapes_name = ph_dict[keys[1]]

        self.shape_table_editor.columns = [ObjectColumn(name='name')]
        for i in range(len(shapes)):
            self.shape_table_editor.columns.append(ObjectColumn(name=shapes[i]))

        self.Shapedropdownlist = keys
        self.Shape = keys[2]
        self._updateShapeTable()

        return

    def _Shape_changed(self, selectedValue):
        self.pshape = selectedValue 
        self.shapes_name = ph_dict[self.pshape]
        self._updateShapeTable()


    def _updateShapeTable(self):
        del(self.shape_table)
        self.shape_table_editor.columns = [ObjectColumn(name='name')]
        for i in range(len(self.shapes_name)):
            print(i,len(self.shapes_name))
            self.shape_table_editor.columns.append(ObjectColumn(name=shapes[i]))
        data = ShapeTable()    
        data.name = "Name"

        for i in range(len(self.shapes_name)):
            print(i,len(self.shapes_name))
            exec('data.'+shapes[i]+'="'+self.shapes_name[i]+'"')
        self.shape_table.append(data)        

        data = ShapeTable()
        data.name = "Shape"
        for i in range(len(self.shapes_name)):
            exec('data.'+shapes[i]+'="'+shapes[i]+'"')
        self.shape_table.append(data)


if __name__ == "__main__": 

    f1 = DynamicTable()
    f1.configure_traits()
4

1 回答 1

0

columns_name指定. columns_TableEditor

在该_updateShapeTable方法中,您应该初始化shape_columns上下文属性,而不是将列附加到它。

from traits.api import HasTraits, Instance, List, Str 
from traitsui.api import Item, View, VGroup, EnumEditor,TableEditor, ObjectColumn

keys = ["key1", "key2", "key3"]
ph_dict={}
ph_dict["key1"] = ["A1","A2","A3"]
ph_dict["key2"] = ["B1", "B2", "B3", "B4",  "B5", "B6", "B7", "B8"]
ph_dict["key3"] = ["C1", "C2","C3", "C4", "C5"]

shapes = ["square", "circle","inverted_triangle", "diamond", "dot", "cross", "plus", "pixel"] 


class ShapeTable(HasTraits):
    pass


class DynamicTable(HasTraits):

    Shape = Str
    Shapedropdownlist = List(Str)
    shapes_name = List(Str)

    shape_table = List(Instance(ShapeTable))
    shape_columns = List(Instance(ObjectColumn()))  
    shape_table_editor=TableEditor(columns_name='shape_columns',
        deletable = True,
        sortable = False,
        sort_model = False,
        show_lines = True,
        line_color = "black",
        editable= False,
        show_column_labels = False)

    traits_view = View(VGroup(
                    Item('Shape',editor=EnumEditor(name='Shapedropdownlist',),),
                    Item( 'shape_table',editor=shape_table_editor,show_label=False,
                            width=0.3, padding=0)),

                    width=500, height=200, resizable=True,
                    title = "Dynamic table trait"
                    )


    def __init__(self):
        super(DynamicTable, self).__init__()

        self.shapes_name = ph_dict[keys[1]]

        self.shape_table_editor.columns = [ObjectColumn(name='name')]

        self.Shapedropdownlist = keys
        self.Shape = keys[2]
        self._updateShapeTable()

        return


    def _Shape_changed(self, selectedValue):
        self.pshape = selectedValue 
        self.shapes_name = ph_dict[self.pshape]
        self._updateShapeTable()


    def _updateShapeTable(self):
        del(self.shape_table)
        self.shape_columns = [ObjectColumn(name='name')]
        for i in range(len(self.shapes_name)):
            print(i,len(self.shapes_name))
            self.shape_columns.append(ObjectColumn(name=shapes[i]))
        data = ShapeTable()    
        data.name = "Name"

        for i in range(len(self.shapes_name)):
            print(i,len(self.shapes_name))
            exec('data.'+shapes[i]+'="'+self.shapes_name[i]+'"')
        self.shape_table.append(data)        

        data = ShapeTable()
        data.name = "Shape"
        for i in range(len(self.shapes_name)):
            exec('data.'+shapes[i]+'="'+shapes[i]+'"')
        self.shape_table.append(data)


if __name__ == "__main__": 

    f1 = DynamicTable()
    f1.configure_traits()
于 2013-11-02T13:25:14.990 回答