【问题标题】:Dynamically changing trait动态变化的特征
【发布时间】:2016-07-07 17:38:23
【问题描述】:

是否可以有两个类

类 SimulationDigitizer(HasTraits): 宽度 = 整数(1920) 高度 = 整数(1080) name = '模拟'

类 FileDigitizer(HasTraits): 文件名 = 文件 名称 = '文件'

另一个类“Digitizer”具有属性(或特征)UserDigitizer,其版本对话框将提出一个带有“模拟”和“文件”的下拉列表,并且根据选择,FileDigitizer 或 SimulationDigitizer 的实例版本并在 UserDigitizer 中得到结果?

谢谢

【问题讨论】:

  • 与您之前的问题一样——您是否真的需要动态创建它,或者在需要时让一个或另一个 出现 给用户就足够了(但是居然一直隐形存在)?

标签: traits enthought traitsui


【解决方案1】:

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

我以下面的代码结束,我想它可以在很多方面进行改进。我是 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多