我有一个Python Tkinter GUI,在其中循环添加了一些菜单项(基于正在运行的工作程序)。当我选择这些菜单项之一时,我总是得到最后一项的值。为了简化操作并进行测试,我制作了一个测试文件,它执行的操作相同。请注意,菜单看起来不错,每个标签都会显示。如果有人可以解决,我将非常感谢您的帮助。
from tkinter import Tk
from tkinter import *
import tkinter.messagebox
import tkinter.simpledialog
def popup(msg='No message'):
tkinter.messagebox.showinfo(msg)
if __name__ == '__main__':
root = Tk()
menu_bar = tkinter.Menu(root)
root.config(menu=menu_bar)
filemenu = tkinter.Menu(menu_bar)
stopworkermenu = tkinter.Menu(filemenu, tearoff=False)
menu_bar.add_cascade(label='File', menu=filemenu)
filemenu.add_cascade(label="Stop Worker", menu=stopworkermenu)
# these lines result in 'Delta' always being returned:
menu_list = ['Alpha', 'Beta', 'Gamma', 'Delta']
for m in menu_list:
stopworkermenu.add_command(label=m, command=lambda: popup(m)
# when these lines are used, each item is returned correctly:
# stopworkermenu.add_command(label='Alpha', command=lambda: popup('Alpha')
# stopworkermenu.add_command(label='Beta', command=lambda: popup('Beta')
# stopworkermenu.add_command(label='Gamma', command=lambda: popup('Gamma')
# stopworkermenu.add_command(label='Delta', command=lambda: popup('Delta')
mainloop()
答案 0 :(得分:0)
我们找到了一种使这项工作有效的方法。更改
stopworkermenu.add_command(label = m,command = lambda:popup(m)
到以下:
stopworkermenu.add_command(label = m,command = lambda boundm = m:popup(boundm)
这似乎是在创建时而不是在调用时将参数绑定到lambda函数。