1

我找到了解决原始问题的方法,但我希望其他人可以解释发生了什么。我最初注意到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直接编辑 a ,则禁用按预期工作。

我找到了一个我不明白的解决方法。

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重要——如果你把它改成passorprint 56或者什么的,它就不再起作用了。

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

4

1 回答 1

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'))
于 2013-12-08T06:59:02.657 回答