Python Atom API: как задать Atom Var при использовании словаря

Atom api - это библиотека, используемая Enaml для реализации MVC. Измените атом var, и пользовательский интерфейс обновится. Измените его в пользовательском интерфейсе, и ваша модель будет обновлена.

Я хотел бы поместить переменную Atom (в данном случае Bool()) в словарь и позже обновить эту переменную

 from atom.api import Atom,Bool
 class MyModel(Atom):
     myBool = Bool()

     def getDict(self):
         return {'mybool':self.myBool}

     def setAllBoolsTrue(self):
         self.myBool = True #example to show that just setting mybool will update UI components that use it

         #now to show how I'd like to generalize to many components

         for k,v in self.getDict().iteritems():
             v = True  # this fails, even though the id(v) is the same as id(self.mybool)

Последнее утверждение не обновляет mybool, оно просто выполняет простое назначение.

Так есть ли способ обновить Bool(), извлеченный из словаря, так же, как это делает простая установка?

изменить: код обновлен, поэтому нет синтаксических ошибок.

редактировать: согласно предложениям в комментариях, я пытался без успеха:

    tempDict = self.getDict();
    #self.myBool = True  # this works
    tempDict['mybool'] = True  #this does not work

2 ответа

Решение

Услышав об одном из разработчиков Atom, вы должны правильно использовать setattr. Я пытался использовать setattr на самом Bool(), но его нужно использовать на подклассе Atom, как показано ниже:

 from atom.api import Atom,Bool
 class MyModel(Atom):
     myBool = Bool()

     def getDict(self):
         return {'myBool':self.myBool}

     def setAllBoolsTrue(self):
         self.myBool = True #example to show that just setting mybool will update UI components that use it

         #now to show how to generalize to many components

         for key,value in self.getDict().iteritems():
             setattr(self,key,True) #this updates the UI

for k, v in getDict(): не будет работать, если ваш getDict() функция возвращает подсказку из двух клавиш, т.е. k, v будет более удачно назван key1, key2 в этом случае, где key2 даже не существует


Если вы действительно хотите реализовать классы, вы можете сделать что-то вроде...

class MyModel(Atom):

    def __init__(self):
        self.myBool = True


>>> model = MyModel()
>>> model.myBool
True
>>> model.myBool = False
>>> model.myBool
False
Другие вопросы по тегам