Включен_ при прослушивании вне объекта модели
Я нашел обходной путь к своей первоначальной проблеме, но я надеюсь, что кто-то еще сможет объяснить, что происходит. Я изначально заметил, что 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
редактируется напрямую, отключение работает как задумано.
Я нашел workaroud, что я не понимаю.
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
или что-то еще, это больше не работает.
Кто-нибудь знает, что здесь происходит?
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'))