我正在尝试创建一个方法列表。 并尝试,如果我可以将它们传递给按钮小部件命令选项。我正在 错误消息
Button {
iconSource: pressed? "image1.png" : "image2.png"
}
如何将method_pointer元组中的方法列表分配给nav_button命令选项。
TypeError: 'set' object does not support indexing
答案 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
当然我不能保证这是你代码中的最后一个错误,如果你正在做其他错误的东西,它仍然可能无效。但这至少解决了前三个问题。