2016-12-21 9 views
3

Atom apiは、EnamlがMVCを実装するために使用するライブラリです。原子varを変更すると、UIが更新されます。 UIでそれを変更すると、モデルが更新されます。私はそのVAR最後の文はmyboolの更新に失敗しPython Atom API:辞書を使用するときにatom varを設定する方法

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) 

を辞書に(この場合はブール値())のAtom VARを入れて、後で更新したいと思います

は、それだけの単純な割り当てを行います。

辞書から取得したBool()を単に設定するのと同じ方法で更新する方法はありますか?

編集:コードが更新され、構文エラーはありません。

編集:で

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

ていますが、地元を再割り当てしようとしているようこれは見えます変数(コピー)。おそらく、 'set'操作で辞書を変更する必要があります。 – Carcigenicate

+1

コードに少なくとも1つの構文エラーがあります。投稿する内容が[MCVE]であることを確認してください。あなたはPython OOPにどれくらい精通していますか?複数のものは少し外れています...あなたの特定の問題は、名前 'v'がリバウンドしていることです。その代わりに、dictを格納し、それをループ内に変更する必要があります。他のすべての問題は脇に置いておきます。 'tmpdict = getDict(); tmpdictのkのために:tmpdict [k] = True'。 –

+0

あなたは正しい@Carcigenicateです。単純な変数の割り当てが行われています。ローカルvarとmyBoolのid()は同じです。元の変数を更新するために呼び出せる関数はありますか?私はセットを見ます。 –

答えて

0

Atomの開発者の一人から聞いた後、答えはSETATTR正しく使用することです。私は、ブール()自体にSETATTRを使用しようとしたが、次のように1は、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 
+0

です。これはsetattrの非Atomアプリケーションとまったく同じように見えます;) –

0

for k, v in getDict():あなたgetDict()関数は2つのキーの辞書を返さない限り動作しません、すなわちk, vが、より適切な名前られるkey1, key2:コメントで提案を1として、私は成功せず、試してみましたこの場合、key2は存在しません。あなたが本当にクラスを実装する場合は、あなたのような何かを行うことができます


...

class MyModel(Atom): 

    def __init__(self): 
     self.myBool = True 


>>> model = MyModel() 
>>> model.myBool 
True 
>>> model.myBool = False 
>>> model.myBool 
False 
+0

@Carcigenicateしかし、そうではありません。あなたが見るように、dictを返します。そしてdictを繰り返して、あなたに鍵を与えます。キーと値のペアを繰り返すことは、Python 2/3の多言語ではないと私は思う。 –

+0

私が投稿した直後に、私はすぐにダウンボトムが好きです。誰かがなぜ私が間違っているのか説明したいですか? – moogle

+0

主な理由は、これは間違って形成された質問であり、その内部のコードは一貫性がなく、間違っているため答えることができないということです。 OPはそれを使っていません。それがクリーンアップされるまで、それをデバッグしようとしても役に立たない。 *しかし*、OPの実際の質問はあなたの答えが助けないdictに突然変異を起こすことです。あなたはコード内で1つのエラーを選択し、それを解決した*間違った*: 'kのための方法はありません、で' vは動作します。 *そして*私は、あなたが挑戦的でない質問を投稿しているのを見てきました。私に* downvoteしてはいけない理由を教えてください。 –

関連する問題