动态变化的特性

时间:2016-07-07 17:38:23

标签: traits enthought traitsui

是否可以有两个班级

类SimulationDigitizer(HasTraits):     width = Int(1920)     height = Int(1080)     name ='Simulation'

class FileDigitizer(HasTraits):     Filename =文件     name ='文件'

另一个具有属性(或特征)UserDigitizer的类'Digitizer',其编辑对话框将提出一个带有'Simulation'和'File'的下拉列表,并根据选择,FileDigitizer或SimulationDigitizer的实例版本并在UserDigitizer中获得结果?

由于

1 个答案:

答案 0 :(得分:0)

感谢Jonathan,你是对的,问题是在许多可能的子组件中选择合适的子组件。

我结束了以下代码,我想它可以在很多方面得到改进。我是Python和Traits的新手。

# -*- coding: utf-8 -*-
from traits.api import HasTraits, Int, File, Enum, Instance
from traitsui.api import View, Item, Handler, HGroup, InstanceEditor

class UserComponent ( HasTraits ):
    """ An empty class from which all user component classes are
        derived.
    """
    pass

class SimulationDigitizer(UserComponent):
    width = Int(1920)
    height = Int(1080)
    nature = 'Simulation'

class FileDigitizer(UserComponent):
    filename = File
    nature = 'Reading a file'

UserDigitizers = [FileDigitizer, SimulationDigitizer]

class UserComponentHandler(Handler):    

    def __init__(self,_user_components_dict):
        Handler.__init__(self)
        self._user_components_dict = _user_components_dict

    def object_user_component_nature_changed ( self, info ):
        # Find new UserComponent class from string in user_component_nature
        new_user_component = self._user_components_dict[info.object.user_component_nature]
        # If different, change user_component value
        if info.object.user_component is not new_user_component:
            info.object.user_component = new_user_component

class Digitizer(HasTraits):
    user_component_nature = Enum([x().nature for x in UserDigitizers])
    _user_file_digitizer = FileDigitizer()
    _user_simulation_digitizer = SimulationDigitizer()

    # Dictionary with keys = nature and values = user digitizers
    _user_digitizers_dict = {x.nature: x for x in [_user_file_digitizer,_user_simulation_digitizer]}

    user_component = Enum(_user_file_digitizer,_user_simulation_digitizer)

    view = View(HGroup(Item('user_component_nature', 
                            label = 'Nature'),
                    Item('user_component',
                            show_label = False, 
                            editor = InstanceEditor(label = 'Edit', 
                                                    kind = 'modal'))),
                handler = UserComponentHandler(_user_digitizers_dict))

d = Digitizer()

if __name__ == '__main__':
    d.configure_traits()