Python 列表中的 Tkinter 标题更改

Python Tkinter title change from list

我试图通过下面的代码简化我的程序的问题。我可以让它工作,但很好奇为什么它不能使用下面的方法工作。

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

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]))

问题是 lambda 中的 string 是变量 string 上的 closed,而不是 string 的值。这意味着变量 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 等放置按钮