Tkinter 教程 - 多选按钮

Jinku Hu 2023年1月30日 2018年1月28日
  1. Tkinter Checkbutton 基本示例
  2. Tkinter Checkbutton 选择/取消选择
  3. Tkinter Checkbutton 多选按钮状态切换
  4. Tkinter Checkbutton 回调函数绑定
  5. 更改 Tkinter Checkbutton 多选按钮默认值
Tkinter 教程 - 多选按钮

Checkbutton 多选按钮控件是一个包含多个可选项的控件。多选按钮可以包含文本或图像。它还可以绑定单击多选按钮时要调用的回调函数。

要在现有父窗口中创建一个 Checkbutton 窗口控件,请使用

tk.Checkbutton(parent, option, ...)

Tkinter Checkbutton 基本示例

import tkinter as tk
 
app = tk.Tk() 
app.geometry('150x100')

chkValue = tk.BooleanVar() 
chkValue.set(True)
 
chkExample = tk.Checkbutton(app, text='Check Box', var=chkValue) 
chkExample.grid(column=0, row=0)
 
app.mainloop()

Tkinter Tutorial Checkbutton 基本示例

chkValue = tk.BooleanVar() 

每个多选按钮都应与变量相关联。选择/取消选择时,变量的数据类型由多选按钮来确定。

chkValue.set(True)

它设置了多选按钮的原始值。因为它只是赋予为 Boolean 数据类型,所以这里只有两个选项,TrueFalse

chkExample = tk.Checkbutton(app, text='Check Box', var=chkValue) 

现在,这里新建了一个 Checkbutton 实例,并且使用我们在上面创建的变量 chkValue

chkExample.grid(column=0, row=0)

除了在 Tkinter 标签部分中引入的 packgrid 是另一种类型的 Tkinter 布局管理器。

Tkinter 有三个布局管理器,

  • pack - 打包
  • grid - 网格
  • place - 放置

我们将在本教程的后半部分介绍这些布局/几何管理器。

Tkinter Checkbutton 选择/取消选择

用户可以单击 GUI 中的多选按钮来选择或取消选择按钮。你也可以使用 select()deselect() 方法选择或取消选中 Checkbutton

chkExample.select()
print "The checkbutton value when selected is {}".format(chkValue.get())
chkExample.select()
print "The checkbutton value when deselected is {}".format(chkValue.get())
The checkbutton value when selected is True
The checkbutton value when deselected is False

这里,Checkbutton 的值是通过 get() 方法获得的。

Tkinter Checkbutton 多选按钮状态切换

多选按钮的状态可以通过 select()deselect() 修改,也可以使用 toggle() 方法切换。

import tkinter as tk
 
app = tk.Tk() 
app.geometry('150x100')

chkValue = tk.BooleanVar() 
chkValue.set(True)
 
chkExample = tk.Checkbutton(app, text='Check Box', var=chkValue) 
chkExample.grid(column=0, row=0)

print "The checkbutton original value is {}".format(chkValue.get())
chkExample.toggle()
print "The checkbutton value after toggled is {}".format(chkValue.get())
chkExample.toggle()
print "The checkbutton value after toggled twice is {}".format(chkValue.get())

app.mainloop()
The checkbutton original value is True
The checkbutton value after toggled is False
The checkbutton value after toggled twice is True

Tkinter Checkbutton 回调函数绑定

Checkbutton 控件用于选择状态,它还可以在选择/取消选择或更直接,切换时将回调函数绑定到事件。每当切换多选按钮状态时,都会触发回调函数。

import tkinter as tk
from _cffi_backend import callback
 
def callBackFunc():
    print "Oh. I'm clicked"
    
app = tk.Tk() 
app.geometry('150x100')

chkValue = tk.BooleanVar() 
chkValue.set(True)
 
chkExample = tk.Checkbutton(app, text='Check Box', 
                            var=chkValue, command=callBackFunc) 
chkExample.grid(column=0, row=0)

app.mainloop()

每当你按下按钮时,你都会看到它在 console 中打印出了 Oh. I'm clicked

Checkbutton 类中的选项 command 用于在按下按钮时绑定回调函数或方法。

更改 Tkinter Checkbutton 多选按钮默认值

与未选中的 Checkbutton 对应的默认值为 0,并且所选的 Checkbutton 的默认值为 1.你还可以将 Checkbutton 默认值及其关联的数据类型更改为其他值和/或数据类型。

import tkinter as tk
 
app = tk.Tk() 
app.geometry('150x100')

chkValue = tk.StringVar() 
 
chkExample = tk.Checkbutton(app, text='Check Box', var=chkValue,
                            onvalue="RGB", offvalue="YCbCr") 
chkExample.grid(column=0, row=0)

chkExample.select()
print "The checkbutton value when selected is {}".format(chkValue.get())
chkExample.deselect()
print "The checkbutton value when deselected is {}".format(chkValue.get())

app.mainloop()
The checkbutton value when selected is RGB
The checkbutton value when deselected is YCbCr
chkExample = tk.Checkbutton(app, text='Check Box', var=chkValue,
                            onvalue="RGB", offvalue="YCbCr") 

onvalueoffvalue 是更改所选和未选状态值的选项。它们可以有数据类型,如 IntStringFloat 或其他。

注意
Checkbutton 多选按钮相关联的 Tkinter 数据类型应该跟它的 onvalueoffvalue 的数据类型相同。否则就会有 _tkinter.TclError 错误。
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn