2015-09-23 44 views
0

我试图通过下面的代码简化与我的程序相关的问题。我可以让它工作,但很好奇,为什么它不能使用下面的方法。列表中的Python Tkinter标题更改

打印值显示第一个索引,但该函数调用最后一个索引。

list1 = ["Title_0", "Title_1"] 

for i, string in enumerate(list1): 
if i == 0: 
    print str(i) + ", " + string # Prints: 0, Title_0 
    btn_monty = Button(the_window, text='Monty Python', command = lambda:the_window.title(string)) 
    #### This also doesn't work #### 
    # btn_monty = Button(the_window, text='Monty Python', command = lambda:the_window.title(list1[i])) 

回答

1

的问题是,拉姆达内stringclosed的变量stringstring不是值。这意味着变量string的值不会被计算,直到实际调用该按钮,并且被调用时它将使用最新值string,这两个按钮的值都相同。

你可以尝试使用默认参数来传递string。示例 -

list1 = ["Title_0", "Title_1"] 

for i, strng in enumerate(list1): 
    print str(i) + ", " + strng # Prints: 0, Title_0 
    btn_monty = Button(the_window, text='Monty Python', command = lambda new_title=strng:the_window.title(new_title)) 

我也改变了变量strng,使其不与string模块冲突(将是一件好事,以避免任何形式的未来问题,如果你决定要导入模块)。此外,你应该确保你使用gridpack等按钮。

+0

downvote的任何特定原因? –

+0

感谢您的快速回答,我现在明白了。 现在应该立即修复,一定有意外,downvoted。 –

+0

@ tom_1230很高兴我能帮到你。不,你是不是低估了,这是一个嫉妒我的人:P。 –