Включен_ при прослушивании вне объекта модели

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