2015-09-23 66 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。 –