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 使用 onvalueoffvalue 【参考方案1】:

您所描述的行为是Radiobuttons 的常见行为。 Checkboxes 旨在以完全不同的方式工作。多个Radiobuttons 链接到同一个变量并根据其值显示为活动或禁用。并且每个Checkbutton 都链接到一个单独的变量,并且具有选中和未选中的值(onvalueoffvaluetristatevalue args)。

我想您正在尝试使用上述通常行为创建多个Checkbuttons。在这种情况下,您需要为每个Checkbutton 创建一个单独的变量,并将value arg 替换为onvalueoffvalue(或者根本不指定值;在这种情况下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,具体取决于是否选择了相应的检查按钮。

或者,如果您想强制多个CheckboxesRadiobuttons 一样工作。在这种情况下使用的小部件是错误的(最终用户会感到困惑),但从技术上讲这是可能的。为此,您需要将所有复选框链接到同一个变量。

这是一个例子(基于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.ttktkinter 一起使用。

【讨论】:

【参考方案2】:

检查按钮和单选按钮有不同的选项,因为它们做不同的事情。

Checkbutton 实例不支持value 选项。相反,它有一个onvalueoffvalue 选项,用于指定小部件打开或关闭时的值。 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 选项

Tkinter:有没有办法默认检查复选框?

python之tkinter使用-复选框操作

如何在 UITableView 的编辑模式下只显示复选标记选择而不选择整个 UITableViewCell?

Python tkinter 多选框控件

Tkinter 之RadioButton单选框标签