如何将方法传递给元组中的Tkinter按钮小部件命令选项

时间:2015-05-07 05:10:41

标签: python python-2.7 tkinter

我正在尝试创建一个方法列表。 并尝试,如果我可以将它们传递给按钮小部件命令选项。我正在 错误消息

Button {
    iconSource: pressed? "image1.png" : "image2.png"
}

如何将method_pointer元组中的方法列表分配给nav_button命令选项。

TypeError: 'set' object does not support indexing

1 个答案:

答案 0 :(得分:3)

问题是{'self.start','self.setup'}不是元组,而是。并且集合没有排序,因此method_pointer[0]毫无意义。

如果你想要一个元组,只需用括号替换大括号:

method_pointer = ('self.start','self.setup')

如果你需要它作为一个集合,你不能索引它...但你仍然可以迭代它(虽然以任意顺序),像这样:

for i, method in enumerate(method_pointer):
    self.nav_button[i]["command"]= lambda: method()
    self.nav_button[i].place(x=10,y=self.nav_bttn_y)
    self.nav_bttn_y +=40

事实上,即使有元组,这也是个好主意。

我们在这里时,你不需要lambda: method_pointer[i]();这与method_pointer[i]完全相同,但更详细,更不易读,更慢。 (同样,您不需要lamdba: method(),只需method。)

但是你有另一个问题:'self.start'不是方法,它是一个字符串。如果你想要self.start方法,你需要传递它,不带引号。

所以,把它们放在一起(并修复你的IndentationError,并部分修改PEP8):

method_pointer = (self.start, self.setup)
for i, method in enumerate(method_pointer):
    self.nav_button[i]["command"] = method
    self.nav_button[i].place(x=10, y=self.nav_bttn_y)
    self.nav_bttn_y += 40

当然我不能保证这是你代码中的最后一个错误,如果你正在做其他错误的东西,它仍然可能无效。但这至少解决了前三个问题。