我正在根据用户输入动态添加下拉列表。用户将输入标题。标题中的每个单词都有与之关联的同义词列表。 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
是否可以通过下拉菜单访问设置的值?
答案 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);