python-3.x 使用循环创建x个tkinter OptionMenu

bksxznpy  于 2022-12-24  发布在  Python
关注(0)|答案(1)|浏览(202)

我尝试创建任意数量的optionmenu,但是在尝试拉取每个optionmenu所选的StringVar()时遇到了麻烦。
目标:创建任意数量的选项菜单,它们具有连续的名称(最多为任意数量)和连续的变量名称,以跟踪当前的选项菜单值
例如,如果选项菜单如下所示:

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 Create 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()
ivqmmu1c

ivqmmu1c1#

给予每个optionmenu一个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()

相关问题