Tkinter - 只标记一个复选框
Posted
技术标签:
【中文标题】Tkinter - 只标记一个复选框【英文标题】:Tkinter - Mark only one Checkbox 【发布时间】:2020-08-18 12:14:35 【问题描述】:以下代码允许用户只选择一个单选按钮。例如,如果用户选择类型 II 按钮,然后单击类型 III 按钮,则之前的选择会消失。
from tkinter import *
root = Tk()
radiobutton_variable = IntVar()
Radiobutton(root, text="Type II", variable = radiobutton_variable, value = 1).grid(row = 0, column = 0)
Radiobutton(root, text="Type III", variable = radiobutton_variable, value = 2).grid(row = 0, column = 1)
Radiobutton(root, text="Type IV", variable = radiobutton_variable, value = 3).grid(row = 1, column = 0)
Radiobutton(root, text="Type V", variable = radiobutton_variable, value = 4).grid(row = 1, column = 1)
mainloop()
如果我对检查按钮小部件使用相同的代码,我会收到错误消息:
TclError: unknown option "-value"
有人知道如何解决这个问题吗?
【问题讨论】:
单选按钮和复选框的工作方式不同。在 Radiobutton 中,一组按钮相互链接到一个变量,并且值决定了哪个应该显示为活动的。在 Checkboxes 中,每个复选框都有一个自己的变量和一个选中的值和一个未选中的值。它们的论点不同,工作方式也不同。Checkbutton
使用 onvalue
和 offvalue
。
【参考方案1】:
您所描述的行为是Radiobuttons
的常见行为。 Checkboxes
旨在以完全不同的方式工作。多个Radiobuttons
链接到同一个变量并根据其值显示为活动或禁用。并且每个Checkbutton
都链接到一个单独的变量,并且具有选中和未选中的值(onvalue
、offvalue
和tristatevalue
args)。
我想您正在尝试使用上述通常行为创建多个Checkbuttons
。在这种情况下,您需要为每个Checkbutton
创建一个单独的变量,并将value
arg 替换为onvalue
和offvalue
(或者根本不指定值;在这种情况下onvalue
默认值为 1 和 offvalue
为 0(对于 IntVar()
),对于 StringVar()
和 Variable()
为“1”和“0”,对于 BooleanVar()
为 True 和 False。
这是一个例子:
import tkinter as tk
root = tk.Tk()
var1, var2, var3, var4 = tk.IntVar(), tk.IntVar(), tk.IntVar(), tk.IntVar() # a separate variable for every Checkbutton
tk.Checkbutton(root, text="Type II", variable=var1, onvalue=4, offvalue=3).pack()
tk.Checkbutton(root, text="Type III", variable=var2).pack()
tk.Checkbutton(root, text="Type IV", variable=var3).pack()
tk.Checkbutton(root, text="Type V", variable=var4).pack()
root.mainloop()
var1
如果第一个检查按钮被选中则等于 4,否则等于 3。
其他变量将等于 1 或 0,具体取决于是否选择了相应的检查按钮。
或者,如果您想强制多个Checkboxes
像Radiobuttons
一样工作。在这种情况下使用的小部件是错误的(最终用户会感到困惑),但从技术上讲这是可能的。为此,您需要将所有复选框链接到同一个变量。
这是一个例子(基于this answer):
import tkinter as tk
root = tk.Tk()
var = tk.IntVar()
checkboxes = []
for i in range(5):
checkboxes.append(tk.Checkbutton(root, onvalue=i + 1, variable=var))
checkboxes[i].pack()
root.mainloop()
这里,var
如果没有选中复选框,则等于 0,如果选中一个,则等于 1-5,具体取决于哪个复选框。
P.S.:使用from tkinter import *
是个坏主意,请改用import tkinter as tk
。否则,您可能会将所有内容混淆,尤其是如果您将 tkinter.ttk
与 tkinter
一起使用。
【讨论】:
【参考方案2】:检查按钮和单选按钮有不同的选项,因为它们做不同的事情。
Checkbutton
实例不支持value
选项。相反,它有一个onvalue
和offvalue
选项,用于指定小部件打开或关闭时的值。 Checkbutton
小部件也需要有自己独特的variable
。
如果您想限制用户,使他们只能从众多值中选择一个,那么 Checkbutton
是错误的小部件。这正是Radiobutton
的用途。单选按钮用于独选,复选按钮用于多选。
【讨论】:
【参考方案3】:如果您希望用户只选择一个复选框,您可以使用复选按钮。通过运行此代码并选择该选项,您将明白这一点。 我知道其他人已经回答了你的问题。但也许我的回答可以帮助别人。
from tkinter import *
root = Tk()
#Same variable but different values
radiobutton_variable = IntVar()
Radiobutton(root, text="Radiobutton only one", variable = radiobutton_variable, value = 1).grid(row = 0, column = 0)
Radiobutton(root, text="Radiobutton only one", variable = radiobutton_variable, value = 2).grid(row = 0, column = 1)
#Same variable but different values
checkbutton_variable = IntVar()
Checkbutton(root, text="Checkbutton only one", variable = checkbutton_variable, onvalue = 3).grid(row = 1, column = 0)
Checkbutton(root, text="Checkbutton only one", variable = checkbutton_variable, onvalue = 4).grid(row = 1, column = 1)
#Same variable, same values or no value
#Select both radio button
both_select_radiobutton_variable = IntVar()
Radiobutton(root, text="radiobutton both", variable = both_select_radiobutton_variable).grid(row = 2, column = 0)
Radiobutton(root, text="radiobutton both", variable = both_select_radiobutton_variable).grid(row = 2, column = 1)
#Same variable, same values or no value
#Select both check button
both_select_checkbutton_variable = IntVar()
Checkbutton(root, text="Checkbutton both", variable = both_select_checkbutton_variable).grid(row = 3, column = 0)
Checkbutton(root, text="Checkbutton both", variable = both_select_checkbutton_variable).grid(row = 3, column = 1)
mainloop()
【讨论】:
以上是关于Tkinter - 只标记一个复选框的主要内容,如果未能解决你的问题,请参考以下文章
Win7 上的 Tkinter highlightcolor 选项