我动态创建了按钮,我想给他们一个命令来更改其图片并更改位置。现在是我无法在命令中亲自传递按钮的问题
我用下面的代码交换了文本中的图片,但问题仍然相同。
它不适用于lambda或我没有正确使用它。
from tkinter import *
karten = {'Stapel': [['D','A','BDA','D'],['D','2','BD2','D']]}
def p(button):
button.config(text='HI')
RS = 'RS'
DA = 'DA'
D2 = 'D2'
root = Tk()
for i in karten:
for j in karten[i]:
vars()[j[2]] = Button(root,text=vars()[j[0]+j[1]],command=lambda: p(vars()[j[2]]))
vars()[j[2]].pack()
root.mainloop()
我希望按钮会更改文本,但只会产生错误。
答案 0 :(得分:2)
x y
1 2015-01-01 NA
2 2015-01-02 NA
3 2015-01-03 NA
4 2015-01-04 NA
5 2015-01-05 NA
6 2015-01-06 NA
返回的字典在vars
内部和外部都不同,因此您将密钥放在一个字典中,然后尝试从另一个字典中检索它。另外,如果可以帮助的话,您可能不应该首先使用lambda
(或vars
或globals
)。 (对于locals
,使用text
毫无意义。)
相反,您可以为全局范围内的按钮创建专用的字典,然后在vars()
中访问该按钮。创建lambda时,不必在字典中显示这些值,而只需调用它即可。
lambda
还要注意buttons = {}
for i in karten:
for j in karten[i]:
b = Button(root, text=j[0]+j[1], command=lambda j=j: p(buttons[j[2]]))
b.pack()
buttons[j[2]] = b
中的j=j
(有关更多说明,请参见here)。
或者,您可以在创建按钮并定义变量后使用lambda
来设置configure
,从而完全不需要字典:
command
或者使用functools.partial
代替for i in karten:
for j in karten[i]:
b = Button(root, text=j[0]+j[1])
b.configure(command=lambda b=b: p(b))
b.pack()
:
lambda b=b