как работает объектная модель traitsui

Может кто-нибудь объяснить, почему этот код дает сбой? Что, по моему мнению, должно произойти, так это то, что он не должен падать, если он использует полные имена свойств, как в данном случае.

from traits.api import *
from traitsui.api import *

class Struct(HasTraits): pass

class Struct1(Struct):
  some_data=Int(4)
  some_more_data=Str('pizza')

class Struct2(Struct):
  some_data=Int(5)
  some_more_data=Str('wossar')

class Subwindow(Handler):
  struct1=Instance(Struct1)
  struct2=Instance(Struct2)

  which_struct=Enum(1,2)
  cur_struct=Any

  def _struct1_default(self): return Struct1()
  def _struct2_default(self): return Struct2()
  def _cur_struct(self): return self.struct1

  @on_trait_change('which_struct')
  def switch_views(self): NotImplemented #switch views here

traits_view=View(
    Item(name='which_struct'),
    Item(name='object.cur_struct.some_data'),
    Item(name='object.cur_struct.some_more_data'),
)

Subwindow().configure_traits()

Когда я запускаю это, я получаю

AttributeError: 'Subwindow' object has no attribute 'object.cur_struct.some_data'

но это так, если вы осмотрите объект.

Я возился с этим примером, и я заставил его работать правильно, если я заменил cur_struct чертой Property, и я не знаю, почему. Однако это невозможно для моего реального приложения, где другой класс прослушивает события из совершенно другого класса и переключает cur_struct.


person aestrivex    schedule 04.11.2013    source источник
comment
Ваша трассировка говорит InteractiveSubwindow, но нигде в коде, который вы цитируете, этого нет. Пожалуйста, исправьте свой пример так, чтобы он работал и выдавал ошибку, о которой вы спрашиваете. Спасибо!   -  person Robert Kern    schedule 05.11.2013
comment
Ах, извините, это просто подокно. Более простой пример дает ту же ошибку.   -  person aestrivex    schedule 07.11.2013


Ответы (1)


Ах, не используйте Item(name=...). Просто передайте имя в качестве первого позиционного аргумента. Конструктор выполняет некоторую специальную обработку переданного ему значения, прежде чем присвоить его трейту name. Явное использование name используется только внутри, когда нам нужно избежать этой обработки.

person Robert Kern    schedule 05.11.2013