Update label of tkinter menubar item? Update label of tkinter menubar item? tkinter tkinter

Update label of tkinter menubar item?


I found the solution myself in the Tcl manpages:

Use the entryconfigure() method like so, which changes the value after it has been clicked:

The first parameter 1 has to be the index of the item you want to change, starting from 1.

from tkinter import *root = Tk()menu_bar = Menu(root)def clicked(menu):    menu.entryconfigure(1, label="Clicked!")file_menu = Menu(menu_bar, tearoff=False)file_menu.add_command(label="An example item", command=lambda: clicked(file_menu))menu_bar.add_cascade(label="File", menu=file_menu)root.config(menu=menu_bar)root.mainloop()


I do not know if that used to be different on 2.7, but it does not work on 3.4 anymore.

On python 3.4 you should start counting entries with 0 and use entryconfig.

menu.entryconfig(0, label = "Clicked!")

http://effbot.org/tkinterbook/menu.htm


Check this dynamic menu example. The main feature here is that you don't need to care about a serial number (index) of your menu item. No index (place) of your menu is needed to track. Menu item could be the first or the last, it doesn't matter. So you could add new menus without index tracking (position) of your menus.

The code is on Python 3.6.

# Using lambda keyword and refresh function to create a dynamic menu.import tkinter as tkdef show(x):    """ Show your choice """    global label    new_label = 'Choice is: ' + x    menubar.entryconfigure(label, label=new_label)  # change menu text    label = new_label  # update menu label to find it next time    choice.set(x)def refresh():    """ Refresh menu contents """    global label, l    if l[0] == 'one':        l = ['four', 'five', 'six', 'seven']    else:        l = ['one', 'two', 'three']    choice.set('')    menu.delete(0, 'end')  # delete previous contents of the menu    menubar.entryconfigure(label, label=const_str)  # change menu text    label = const_str  # update menu label to find it next time    for i in l:        menu.add_command(label=i, command=lambda x=i: show(x))root = tk.Tk()# Set some variableschoice = tk.StringVar()const_str = 'Choice'label = const_strl = ['dummy']# Create some widgetsmenubar = tk.Menu(root)root.configure(menu=menubar)menu = tk.Menu(menubar, tearoff=False)menubar.add_cascade(label=label, menu=menu)b = tk.Button(root, text='Refresh menu', command=refresh)b.pack()b.invoke()tk.Label(root, textvariable=choice).pack()root.mainloop()