我找到了原始问题的解决方法,但我希望其他人可以解释发生了什么。我最初注意到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
函数的内容很重要 - 如果您将其更改为pass
或print 56
或其他任何内容,则它将不再有效。
有谁知道这里发生了什么?
答案 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'))