【问题标题】:Tkinter: Adding drop downs dynamically and getting their valuesTkinter:动态添加下拉菜单并获取它们的值
【发布时间】:2019-04-13 15:26:37
【问题描述】:

我正在根据用户输入动态添加下拉菜单。用户将输入标题。标题中的每个单词都有一个与之相关的同义词列表。 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

有没有办法可以从我的下拉菜单中访问设置的值?

【问题讨论】:

  • 每个OptionMenu 都需要自己的variable - 但你只使用一个variable 来代替所有OptionMenu
  • 你可以用while i &lt; len(lists): OPTIONS = lists[i]代替for OPTIONS in lists:,它不需要i
  • 感谢回复,如何单独访问变量?
  • 另外我如何给每个下拉其自己的变量?
  • 在我看到的代码中 variable 。你是怎么创造的?您知道如何将元素保留在列表中吗?所以将变量保留在列表中。

标签: python pandas tkinter


【解决方案1】:

OptionMenu 中使用command=,您可以指定在您更改选择时将获得选定值的函数。

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():OptionMenu 中的command= 需要获取单个参数的函数 - 即。 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() 来获取选定的值。如果您需要所有选定的值,那么您必须为每个 OptionMenu 创建单独的 StringVar 并保留在列表中。当您单击按钮时,您可以使用带有变量列表的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()

【讨论】:

  • 这对我有用!但是,当我从下拉列表中选择一个项目时,下拉列表的默认值不会改变。有没有办法得到这个?
  • 什么默认值?如果您需要在开始时选择一些值,那么您 StringVar(value=options[0])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多