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