Reputation: 47
Currently new to Tkinter, and while researching I found very little documentation on Tkinter's OptionMenu widget. I'd like to be able to use a single callback function for multiple menus, but I am unable to figure out how to do so.
Currently, my code is something like this:
root = tk.Tk()
options = ["Option A", "Option B"]
message = "Nothing selected!"
def optionsCallback(selection):
message.set(selection)
#more code here
optionsMenu = ttk.OptionMenu(root, tk.StringVar(),
"Select an option",*options,
command = optionsCallback).pack()
optionsLbl = ttk.Label(root, textvariable = message).pack()
Is it possible to specify an additional parameter such that the callback function is able to decipher which OptionMenu is the one calling it?
Something like this:
root = tk.Tk()
message = "Nothing selected!"
options = ["Option A", "Option B"]
def optionsCallback(selection, menu):
if menu == 'A':
message.set("this is menu A, " + selection)
if menu == 'B':
message.set("this is menu B, " + selection)
optionsMenuA = ttk.OptionMenu(root, tk.StringVar(),
"Select an option",*options,
command = optionsCallback).pack() #how to specify?
optionsMenuB = ttk.OptionMenu(root, tk.StringVar(),
"Select an option",*options,
command = optionsCallback).pack() #how to specify?
optionsLbl = ttk.Label(root, textvariable = message).pack()
Upvotes: 0
Views: 1599
Reputation: 46678
You can use lambda
:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
message = tk.StringVar(value="Nothing selected!")
options = ["Option A", "Option B"]
def optionsCallback(selection, menu):
if menu == 'A':
message.set("this is menu A, " + selection)
if menu == 'B':
message.set("this is menu B, " + selection)
optionsMenuA = ttk.OptionMenu(root, tk.StringVar(),
"Select an option", *options,
command=lambda x: optionsCallback(x, "A")).pack()
optionsMenuB = ttk.OptionMenu(root, tk.StringVar(),
"Select an option", *options,
command=lambda x: optionsCallback(x, "B")).pack()
optionsLbl = ttk.Label(root, textvariable = message).pack()
root.mainloop()
Note that message
has been changed from normal string to StringVar()
.
Upvotes: 1