Tkinter:动态添加下拉列表并获取其值

时间:2019-04-13 15:26:37

标签: python pandas 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 个答案:

答案 0 :(得分:1)

使用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() ,您可以分配将获得更多参数的函数,并且可以将数字作为第二个参数。

on_select(text, 0)

因此,现在,第一个OptionMenu运行on_select(text, 1),然后第二个StringVar()运行,因此函数可以知道选择了哪个OptionMenu,并且可以从数据中获取正确的值(或执行其他操作)


您还可以使用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() 循环来获取所有选定的值。

var data = '254,,one,one,one,99,,one,one,ORCHARD,one,ON,one/255,254,TWO,TWO,TWO,99',
    result = data
        .split('/')
        .map(s => s.split(','))
        .reduce((r, [index, ...array]) => (r[index] = array, r), []);

console.log(result);