2012-04-20 66 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!" 

这个语法看起来一样的字典键分配一个值。 如何为用户定义的对象定义此行为的可能性? 能否请你告诉用一个例子如:

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

编辑1(响应kindall和jsbueno): 我试图做调用分配给e["alpha"]42

print e["alpha"] 

你的代码我说:

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

但我仍然得到'示例'不是可自定义的TypeError。


编辑2

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

回答

5

定义__setitem__();见here。还有相应的__getitem__()

作为一个例子:

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 

检查完整的文档,用于仿真词典等内置类型的: http://docs.python.org/reference/datamodel.html

+0

谢谢!我试图通过输入'print e [“alpha”]'来调用值'42'。我通过定义'__getitem__'来定义它。但是我仍然得到一个TypeError。你能检查我编辑过的原始回复吗? – Bentley4 2012-04-21 15:47:18

+1

'__getitem __()'只有两个参数,你需要三个参数。我相信这是问题所在。 – kindall 2012-04-22 00:23:27

相关问题