使用循环创建 RadioButtons 但问题是它们具有相同的值

Creating RadioButtons with a loop but problem with them having the same value

我正在尝试 sheet 有“n”个 4 选项问题的考试。 我已经用循环创建了“n”组 4 个水平 Radiobuttons。 问题是每次选择某个单选按钮时,所有其他组的单选按钮也会切换到该值。 e.g.: For question 1 when option 4 (with value=4) is selected all other sets' Radiobuttons will switch to option 4. I think this is due to them having the same value.

如何让它们不全部切换? 尝试在循环结束时将 Radiobutton 的变量设置为 IntVar,但它会删除 Radiobutton 的原始值,因此它没有用(尽管它确实使它们都不会立即切换). 我该怎么办?

monokeyholder = IntVar()

for i in range(len(lickey)):

    ttk.Label(mainframe, text=(i + 1)).grid(row=i + 1, column=0)

    ttk.Radiobutton(mainframe, value=1, variable=monokeyholder,
                    command=Sett).grid(row=i + 1, column=1)

    ttk.Radiobutton(mainframe, value=2, variable=monokeyholder,
                    command=Sett).grid(row=i + 1, column=2)

    ttk.Radiobutton(mainframe, value=3, variable=monokeyholder,
                    command=Sett).grid(row=i + 1, column=3)

    ttk.Radiobutton(mainframe, value=4, variable=monokeyholder,
                    command=Sett).grid(row=i + 1, column=4)

有没有办法让他们既不转换又保值?我应该使用不同的大师还是手动做 200+ Radiobuttons(我怀疑这是唯一的方法)。

编辑:Sett 定义为将每个选定按钮的值附加到列表中。它确实按预期工作。

Tkinter 使用该变量来了解哪些单选按钮属于一组。因此,每一行都需要使用它自己的 IntVar 实例。管理它们的最简单方法是将它们存储在列表中。

解决方案看起来像这样:

monokeyholder = []
for i in range(len(lickey)):

    var = tk.IntVar(value=0)
    monokeyholder.append(var)
    ...

    ttk.Radiobutton(..., value=1, variable=var, ...)
    ttk.Radiobutton(..., value=2, variable=var, ...)
    ttk.Radiobutton(..., value=3, variable=var, ...)
    ttk.Radiobutton(..., value=4, variable=var, ...)

这样,您就可以通过以下方式获取任何行的值:

print(monokeyholder[3].get())

这是一个完整的工作示例。当你 运行 它时,选中你想要的任何复选框,然后单击“显示值”按钮以查看值。

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def show_values():
    values.delete("1.0", "end")
    for i in range(10):
        values.insert("end", f"Row {i+1}: {monokeyholder[i].get()}\n")

maxrows = 10
mainframe = tk.Frame(root)
showbutton = tk.Button(root, text="Show values", command=show_values)
values = tk.Text(root, height=maxrows, width=20)

showbutton.pack(side="bottom")
mainframe.pack(side="left", fill="both", expand=True, padx=10, pady=10)
values.pack(side="right", fill="both", expand=True)

monokeyholder = []
for i in range(maxrows):

    var = tk.IntVar()
    monokeyholder.append(var)

    ttk.Label(mainframe, text=(i + 1)).grid(row=i, column=0)

    ttk.Radiobutton(mainframe, value=1, variable=var).grid(row=i, column=1)
    ttk.Radiobutton(mainframe, value=2, variable=var).grid(row=i, column=2)
    ttk.Radiobutton(mainframe, value=3, variable=var).grid(row=i, column=3)
    ttk.Radiobutton(mainframe, value=4, variable=var).grid(row=i, column=4)


root.mainloop()