循环将菜单项添加到Tkinter菜单会导致返回最后一个菜单项

时间:2019-03-04 20:50:53

标签: python tkinter menu

我有一个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()

1 个答案:

答案 0 :(得分:0)

我们找到了一种使这项工作有效的方法。更改

stopworkermenu.add_command(label = m,command = lambda:popup(m)

到以下:

stopworkermenu.add_command(label = m,command = lambda boundm = m:popup(boundm)

这似乎是在创建时而不是在调用时将参数绑定到lambda函数。