使用循环创建 RadioButtons 但问题是它们具有相同的值
Creating RadioButtons with a loop but problem with them having the same value
我正在尝试 sheet 有“n”个 4 选项问题的考试。
我已经用循环创建了“n”组 4 个水平 Radiobutton
s。
问题是每次选择某个单选按钮时,所有其他组的单选按钮也会切换到该值。
e.g.: For question 1 when option 4 (with value=4
) is selected all other sets' Radiobutton
s 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+ Radiobutton
s(我怀疑这是唯一的方法)。
编辑: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()
我正在尝试 sheet 有“n”个 4 选项问题的考试。
我已经用循环创建了“n”组 4 个水平 Radiobutton
s。
问题是每次选择某个单选按钮时,所有其他组的单选按钮也会切换到该值。
e.g.: For question 1 when option 4 (with value=4
) is selected all other sets' Radiobutton
s 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+ Radiobutton
s(我怀疑这是唯一的方法)。
编辑: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()