Используя command=
в OptionMenu
, вы можете назначить функцию, которая будет получать выбранное значение при изменении выбора.
import tkinter as tk
#--- functions ---
def on_select(text):
print('text:', text)
print('---')
#--- main ---
data = ['a,b,c', 'x,y,z']
root = tk.Tk()
for i, options in enumerate(data):
options = options.split(',')
op = tk.OptionMenu(root, tk.StringVar(), *options, command=on_select)
op.pack()
root.mainloop()
command=
в Button
ожидаемая функция, которая не получает параметры -то есть.def on_select():
но command=
в OptionMenu
ожидает функцию, которая получает один параметр - т.е.def on_select(text):
Этот код не требуется variable = tk.StringVar()
Итак, вы выбрали значение, но не знаете, в каком OptionMenu
оно было выбрано - сначала иливторой.Используя lambda
, вы можете назначить функцию, которая получит больше параметров, и вы можете указать число в качестве второго параметра.
import tkinter as tk
#--- functions ---
def on_select(text, number):
print('text:', text)
print('number:', number)
print('data[number]:', data[number])
print('---')
#--- main ---
data = ['a,b,c', 'x,y,z']
root = tk.Tk()
for i, options in enumerate(data):
options = options.split(',')
op = tk.OptionMenu(root, tk.StringVar(), *options, command=lambda text, number=i:on_select(text, number))
op.pack()
root.mainloop()
Итак, теперь первый OptionMenu запускает on_select(text, 0)
, а второй запускает on_select(text, 1)
, поэтому функция знает, какое OptionMenu было выбрано, и может получать правильные значения из данных (или выполнять другие действия)
Вы также можете использовать StringVar()
для получения выбранных значений.если вам нужны все выбранные значения, вам нужно создать отдельные StringVar
для каждого OptionMenu
и сохранить их в списке.Когда вы нажимаете кнопку, вы можете использовать цикл for
со списком переменных, чтобы получить все выбранные значения.
import tkinter as tk
#--- functions ---
def on_click():
for number, var in enumerate(all_variables):
print(number, '| selected:', var.get(), '| all:', data[number])
#--- main ---
data = ['a,b,c', 'x,y,z']
root = tk.Tk()
all_variables = []
for options in data:
options = options.split(',')
var = tk.StringVar()
all_variables.append(var)
op = tk.OptionMenu(root, var, *options)
op.pack()
b = tk.Button(root, text='OK', command=on_click)
b.pack()
root.mainloop()