如何将方法从元组传递给 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
当然,我不能保证这是您代码中的最后一个错误,如果您在做 其他 事情时出错,它仍然可能无法正常工作。但这至少解决了前三个问题。
我正在尝试创建一个方法列表。 并尝试是否可以将它们传递给按钮小部件命令选项。我正在 错误信息
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
当然,我不能保证这是您代码中的最后一个错误,如果您在做 其他 事情时出错,它仍然可能无法正常工作。但这至少解决了前三个问题。