enabled_when在模型对象外部进行侦听

时间:2013-12-05 20:08:44

标签: python enthought traits traitsui

我找到了原始问题的解决方法,但我希望其他人可以解释发生了什么。我最初注意到enabled_when,我想象visible_when似乎也只是响应来自模型对象的特征事件而生效。如果事件源自某个其他对象,即使编辑器引用它,它似乎也不会正确传播。

class DirectObjectPronoun(HasTraits):
    text=Str
    typable=Bool(False)

    traits_view=View(
        Item(name='typable'),
        Item(name='text',enabled_when='typable'))

class IndirectObjectPronoun(HasTraits):
    referent=Instance(DirectObjectPronoun,())

    traits_view=View(
        Item(name='typable',object='object.referent'),
        Item(name='text',object='object.referent',
            enabled_when='object.referent.typable'))

IndirectObjectPronoun().configure_traits()

所需的行为是文本窗口在typable is True时启用,否则禁用。观察到的行为是文本窗口始终被禁用(但如果typable的默认值设置为True,则它始终启用,因此问题必须在侦听器中。)

如果直接编辑DirectObjectPronoun,则禁用按预期工作。

我发现了一个我不理解的工作方法。

class IndirectObjectPronoun(HasTraits):
    stupid_listener=Bool
    referent=Instance(DirectObjectPronoun,())

    traits_view=View(
        Item(name='typable',object='object.referent'),
        Item(name='text',object='object.referent',
            enabled_when='object.referent.typable'))

    @on_trait_change('referent.typable')
    def _stupid_listener_listens_stupidly(self):
        self.stupid_listener=self.referent.typable

这个想法非常简单:创建一个愚蠢的变量,除了监听条件之外什么都不做,然后将该局部变量设置为条件。

但是,当我测试这个时,我忘记更改enabled_when,但无论如何它都能正常工作。在某种程度上,添加此侦听器似乎已提醒IndirectObjectPronoun无论如何它应该听取此变量。似乎_stupid_listener_listens_stupidly函数的内容很重要 - 如果您将其更改为passprint 56或其他任何内容,则它将不再有效。

有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

没有研究来源,我不知道它为什么不起作用;至少,你描述的不一致似乎是错误的。

更直观的解决方法/解决方案是使用委派:

class IndirectObjectPronoun(HasTraits):
    referent=Instance(DirectObjectPronoun,())
    typable = DelegatesTo('referent')

    traits_view=View(
        Item(name='typable',object='object.referent'),
        Item(name='text',object='object.referent',
             enabled_when='typable'))