按钮是否有可能通过自己的命令传递自己?

时间:2019-01-14 10:41:37

标签: python tkinter

我动态创建了按钮,我想给他们一个命令来更改其图片并更改位置。现在是我无法在命令中亲自传递按钮的问题

我用下面的代码交换了文本中的图片,但问题仍然相同。

它不适用于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()

我希望按钮会更改文本,但只会产生错误。

1 个答案:

答案 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(或varsglobals)。 (对于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