#python #pandas #tkinter
#питон #панды #tkinter
Вопрос:
Я добавляю выпадающие списки динамически на основе пользовательского ввода. Пользователь введет заголовок. У каждого слова в названии есть список синонимов, связанных с ними. Tkinter добавит выпадающие списки синонимов динамически на основе пользовательского ввода. Однако я не могу индивидуально получить доступ к значению каждого выпадающего списка.
Переменная lists представляет собой список списков, содержащих синонимы для каждого слова, введенного пользователем.
def ok():
print ("value is:" variable.get())
i = 0
while i < len(lists):
OPTIONS = lists[i]
OPTIONS = OPTIONS.split(',')
variable = StringVar(master)
dropdown = OptionMenu(master, variable, *OPTIONS)
dropdown.pack(side=LEFT, fill=X, expand=YES)
button = Button(master, text="Swap", command=ok)
button.pack(side=LEFT, expand=YES)
i = i 1
Есть ли способ получить доступ к набору значений из моих выпадающих списков?
Комментарии:
1. каждому
OptionMenu
нужен свойvariable
— но вы используете только одинvariable
для всехOptionMenu
2. вместо
while i < len(lists): OPTIONS = lists[i]
вы можете использоватьfor OPTIONS in lists:
, и это не нужноi
3. Спасибо за ответ, как мне получить доступ к переменным по отдельности?
4. Кроме того, как бы я дал каждому выпадающему списку свою собственную переменную?
5. в коде , который я вижу
variable
. как вы его создали? вы знаете, как сохранить элементы в списке? Поэтому сохраняйте переменные в списке.
Ответ №1:
Используя command=
in 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
ожидаемой функции, которая не получает параметры — ie. def on_select():
но command=
в OptionMenu
ожидаемой функции, которая получает один параметр — ie. 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()
Итак, теперь выполняется первое on_select(text, 0)
OptionMenu, а второе выполняется 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()
Комментарии:
1. Это сработало для меня! Однако, когда я выбираю элемент из своего выпадающего списка, значение по умолчанию для выпадающего списка не меняется. Есть ли способ получить это?
2. какое значение по умолчанию? если вам нужно выбрать какое-либо значение при запуске, тогда вы
StringVar(value=options[0])