我一直在拼命想让这部分代码在我的程序中运行。我本质上想从文件中读取几个选项,并从这些选项中创建Tkinter按钮。创建按钮没有问题;目前,我不能让代码运行我想要的功能。
from Lib import StegosaurMainCode as Steg
...
class App:
def __init__(self, master, menu):
buttons = []
for counter in range(0, len(menu[0])):
text = menu[0][counter]
func = menu[1][counter]
att = menu[2][counter]
buttons.append(Button(text=text, command=lambda: Steg.func(att)))
frame = Frame(master)
for item in buttons:
item.pack()
frame.pack()
在这个类中,func是我想要调用的函数,Steg是另一个文件中的外部代码,att是函数的属性。我似乎无法弄清楚为什么Steg.func
试图在Steg中调用一个名为" func"而不是变量func
答案 0 :(得分:0)
让lambda在每次通话时重新绑定att
参数。
class App:
def __init__(self, master, menu):
buttons = []
for counter in range(0, len(menu[0])):
text = menu[0][counter]
func = menu[1][counter]
att = menu[2][counter]
buttons.append(Button(text = text, command = lambda att = att: Steg.func(att)))
frame = Frame(master)
for item in buttons:
item.pack()
frame.pack()
答案 1 :(得分:0)
假设menu[1][counter]
包含字符串而不是对实际函数的引用,则需要获取对该函数的引用,然后可以将该函数用作command
属性的值。你可以用getattr做到这一点:
func = getattr(steg, menu[1][counter])
完成后,您可以使用func
,就好像它是一个实际的功能一样。但是,您需要将变量绑定到它们的当前值,因此您需要将它们作为参数传递给lambda:
button = Button(text=text, command=lambda func=func, attr=att: func(att)))