2012-04-20 8 views
1

次のコードは、Tkinterモジュールを使用して簡単なGUIを作成します。ユーザ定義オブジェクトの辞書的な値の割り当てをどのように定義しますか?

import Tkinter 

root = Tkinter.Tk() 

myContainer1 = Tkinter.Frame(root) 
myContainer1.pack() 

button1 = Tkinter.Button(myContainer1) 
button1["text"]= "Hello, World!" 
button1["background"] = "green"  
button1.pack()     

root.mainloop() 

は今、次のコードビットを見て:

button1["text"]= "Hello, World!" 

この構文は、辞書のキーに値を割り当てると同じように見えます。 ユーザー定義オブジェクトのこの動作の可能性をどのように定義しますか? 次のような例を示してもらえ:私は実行してe["alpha"]に割り当てられた値42を呼び出すようにしようとしている :

class Example(object): 
    def __init__(self, length = 1, width= 2): 
     self.length = length 
     self.width = width 

編集1(応答がKindall氏とjsbuenoします)あなたのコードに

print e["alpha"] 

は、私が追加:

def __getitem__(self, key, value): 
    if key in self.validkeys: 
     getattr(self, key, value) 
    else: 
     raise KeyError 

しかし、私はまだ 'Example'はsubscriptable TypeErrorではありません。


編集2

def __getitem__(self, key): 
    if key in self.validkeys: 
     return getattr(self, key) 
    else: 
     raise KeyError 

答えて

5

__setitem__()を定義します。 hereを参照してください。対応する__getitem__()もあります。

例として: http://docs.python.org/reference/datamodel.html

+0

ありがとう:

class Example(object): # define which names can be assigned using [...] syntax validkeys = set("alpha beta gamma".split()) # assign valid names as attributes on our object def __setitem__(self, key, value): if key in self.validkeys: setattr(self, key, value) else: raise KeyError("Key must be one of %s", ", ".join(self.validkeys)) e = Example() e["alpha"] = 42 print(e.alpha) # prints 42 

組み込み型で辞書やその他をエミュレートするための完全なドキュメントをチェック!私は 'print '[" alpha "]'とタイプして値 '42'を呼び出そうとしています。私は '__getitem__'を定義してこれを定義しました。しかし、私はまだTypeErrorを取得します。編集したオリジナルの応答を確認できますか? – Bentley4

+1

'__getitem __()'は2つの引数だけをとります。あなたは3つを取っています。私はそれが問題だと確信しています。 – kindall

関連する問題