Tkinter: динамическое добавление выпадающих списков и получение их значений

#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])