Python的Tkinter的OptionMenu添加一个命令到多个OptionMenus(Pyth

2019-10-17 02:44发布

基本上,我有一系列在一个循环中创建OptionMenus的,但现在还是空的:

option_menu = []
for ii in range(jj):
    option_menu.append([])  
    for ll in range(kk):   
        option_menu[ii].append(OptionMenu(frame,tkinter_text_var[ii][ll],''))

然后在其他地方我用一个复选框沿线的设置值:

for ii in range(jj):
    for ll in range(kk):   
        option_menu[ii][ll]["menu"].add_command(label = name_from_box.get(), command = lambda: tkinter_text_var[ii][ll].set(name_from_box.get()))

这工作正确填写所有OptionMenus的,但是当我选择在任何OptionMenus的值,它只设置option_menu [JJ] [KK](即最后一个制)。

所以我做了什么错?

Answer 1:

这是一个涉及关闭一个非常普遍的问题。 请看下面的例子:

alist = [lambda : x for x in range(10) ]
print (alist[2]()) #9
print (alist[4]()) #9

The'll都是9.为什么? 因为每个lambda函数指的是变量xx被在通过循环来改变,但它们仍然指向同一个对象

解决此问题的方法是使用默认参数。 在创建函数时的默认参数进行评估,而不是当它被调用。

alist = [lambda y=x: y for x in range(10) ]
print (alist[2]()) #2
print (alist[4]()) #4

(另一种方式做同样的事情涉及functools.partial你会有时会看到...)

我经常喜欢说的 - “照顾与倒闭潮”。 他们可以是有点棘手。



文章来源: Python Tkinter OptionMenu add a command to multiple OptionMenus