Tkinter: динамическое добавление выпадающих списков и получение их значений - PullRequest
0 голосов
/ 13 апреля 2019

Я добавляю выпадающие списки динамически на основе пользовательского ввода.Пользователь будет вводить заголовок.Каждое слово в названии имеет список синонимов, связанных с ними.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 Ответ

1 голос
/ 13 апреля 2019

Используя 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...