使用循环创建x个tkinter选项菜单



我试图创建任意数量的选项菜单,但在试图拉出每个选项菜单选择的StringVar()时遇到麻烦。

目标:创建任意数量的具有连续名称(最多为任意数量)和连续变量名称的选项菜单,以跟踪当前选项的值

例如,如果optionmenu如下所示:

import tkinter as tk
from tkinter import *
root = tk.Tk()
root.geometry()
dropdown1 = StringVar()
Dropdownoptions = [
"option1",
"option2",
"option3"
]
dropdownfirst = tk.OptionMenu(root, dropdown1, *Dropdownoptions)
dropdownfirst.grid(column=0, row=0)
root.mainloop()

如果使用字典,我不知道如何从每个选项菜单中拉出值。当看到其他关于使用字典创建变量的问题时,大多数答案都归结为"学习如何使用字典"。而不是回答问题。

有一个非常类似的问题张贴在Tkinter创建OptionMenus With Loop,但遗憾的是它不适用于我的情况。

带有网格和不工作按钮的新代码:

import tkinter as tk

def erase_option():
for (name, var) in options.items():
print(var.get())
# print(options['optionmenu4'])
# This just places label over dropdown, doesnt successfully take place for removal
labelforemoval = tk.Label(text=" ")
labelforemoval.grid(column=0, row=4)
labelforemoval.grid_forget()

root = tk.Tk()
Dropdownoptions = [
"option1",
"option2",
"option3"
]
maxval = 10
options = {}
for om, x in zip(range(maxval), range(maxval)):
name = f"optionmenu{om}"
var = tk.StringVar()
options[name] = var
name = tk.OptionMenu(root, var, *Dropdownoptions)
name.grid(column=0, row=x)
button = tk.Button(root, text="Erase 5th option", command=erase_option)
button.grid(column=0, row=maxval)
root.mainloop()

给每个选项菜单一个自己的StringVar实例。将这些实例保存在列表或字典中。要获取值,请遍历列表。

下面的代码创建一个名为options的字典。它在循环中创建一系列变量和选项菜单,将每个变量添加到这个options字典中。函数print_options遍历列表,打印出每个选项的键和值。

import tkinter as tk
def print_options():
for (name, var) in options.items():
print(f"{name}: {var.get()}")
root = tk.Tk()
Dropdownoptions = [
"option1",
"option2",
"option3"
]
options = {}
for om in range(10):
name = f"Option {om}"
var = tk.StringVar(value="")
options[name] = var
om = tk.OptionMenu(root, var, *Dropdownoptions)
om.pack()
button = tk.Button(root, text="Print Options", command=print_options)
button.pack(side="bottom")
root.mainloop()

最新更新