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

How to pass methods to a Tkinter button widget command option from a tuple

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

TypeError: 'set' object does not support indexing

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

class ADB(Frame):
       __init_(self,parent):
         sel.parent=parent
         self.nav_button=[]    
         for i in range(0,2):
             self.nav_button.append(Button(self.parent)




       def start(self) :
            ...........

       def setup(self):
            ...........
       self.nav_bttn_y=15
       method_pointer={'self.start','self.setup'}


        for i in range(0,2):

            self.nav_button[i]["command"]= lambda :method_pointer[i]()
            self.nav_button[i].place(x=10,y=self.nav_bttn_y)

            self.nav_bttn_y +=40

问题是 {'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

当然,我不能保证这是您代码中的最后一个错误,如果您在做 其他 事情时出错,它仍然可能无法正常工作。但这至少解决了前三个问题。