我找到了解决原始问题的方法,但我希望其他人可以解释发生了什么。我最初注意到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
重要——如果你把它改成pass
orprint 56
或者什么的,它就不再起作用了。
有谁知道这里发生了什么?