I have a Python Tkinter GUI where some menu items are added in a loop (based on workers that are running). When I select one of these menu items, I always get the value of the last item. To simplify things and do a test, I made a test file and it does the same thing. Note that the menu looks fine, each label shows. If anyone can think of a work around, I would really appreciate the help.
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()