Checkbutton 复选按钮
Checkbutton 是 tkinter 里用来可以让用户用鼠标进行“复选”的按钮对象,这篇教学会介绍如何在 tkinter 视窗里加入 Checkbutton 复选按钮,并实作勾选 Checkbutton 后进行互动的程序。
快速导览:
因为 Google Colab 不支援 tkinter,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
加入 Checkbutton
建立 tkinter 视窗对象后,透过 Checkbutton 方法,就能在视窗对象中建立 Checkbutton 复选按钮,必要的参数有两个,第一个表示要加入的视窗对象,第二个则是标签参数 ( 通常是文字 text、图片 image ),建立 Checkbutton 后再使用 pack() 方法将其加入 ( 参考 pack 参数设定 ),下方的程序码执行后,会在视窗里加入两个 Checkbutton ( 位置、大小和颜色都使用默认值 ),因为尚未做其他设定,所以两个 Checkbutton 都会处在尚未勾选的状态。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
check_btn1 = tk.Checkbutton(root, text='Apple') # 放入第一個按鈕
check_btn1.pack()
check_btn2 = tk.Checkbutton(root, text='Banana') # 放入第二個按鈕
check_btn2.pack()
root.mainloop()
判断是否勾选 Checkbutton
如果要判断是否勾选 Checkbutton,并取得勾选的值,需要使用 StringVar() 方法建立文字变数 ( 或使用 IntVar() 建立数字变数 ),接着将 Checkbutton variable 参数指向同样的文字变数,勾选按钮时,文字变数的内容就会更新为 onvalue 的内容,取消勾选时就会更新为 offvalue 的内容。
- 如果要使用 print 印出 tkinter 的变数内容,需要搭配 get() 方法才能取得变数内容并正常印出。
- 使用 select() 方法可预先勾选,diselect() 方法取消勾选。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
# 定義 show 函式,印出勾選的值
def show():
print(var1.get(), var2.get()) # 使用 get() 方法取得變數內容
var1 = tk.StringVar() # 設定文字變數,並綁定第一個 Checkbutton
check_btn1 = tk.Checkbutton(root, text='Apple',
variable=var1, onvalue='Apple', offvalue='--',
command=show)
check_btn1.pack()
check_btn1.deselect() # 開始時不要勾選
var2 = tk.StringVar() # 設定文字變數,並綁定第二個 Checkbutton
check_btn2 = tk.Checkbutton(root, text='Banana',
variable=var2, onvalue='Banana', offvalue='--',
command=show)
check_btn2.pack()
check_btn2.deselect() # 開始時不要勾選
root.mainloop()
Checkbutton 参数设定
加入 Radiobutton 之后,可以透过 Radiobutton 的参数调整内容的样式,下方列出 Radiobutton 和其他元件相同的参数:
| 参数 | 说明 |
|---|---|
| anchor | 摆放位置,可以设定 n、s、w、e、ne、nw、sw、se、center ( e 右,w 左,s 下,n 上 ),默认 center。 |
| text | 文字内容,可以使用换行符 ( \n )。 |
| width | 宽度,单位是字元数,默认 0。 |
| height | 高度,单位是字元数,默认 0。 |
| padx | 内容和标签左右边界的间距 ( px ),默认 1。 |
| pady | 内容和标签上下边界的间距 ( px ),默认 1。 |
| bg/background | 背景颜色,可以使用十六进制色码或颜色名称。 |
| fg/foreground | 文字颜色,可以使用十六进制色码或颜色名称。 |
| font | 字型设定,包含字体、大小 ( px )、粗体 ( bold )、斜体 ( italic )。 |
| justify | 多行文字的对齐方式,可以设定 left、right、center,默认 center。 |
| cursor | 鼠标移动到标签的样式,可以设定 arrow、circle、cross、plus...等,默认 arrow。 |
| relief | 边框样式,可以设定 flat、sunken、raised、groove、ridge、solid,默认 flat。 |
| bd/borderwidth | 边框粗细,默认 1。 |
| textvariable | 文字内容的变数名称,如果变数被修改,文字就会发生变化。 |
| underline | 第几个字元开始加底线 ( 0 为第一个字元, 默认 -1 不加底线 )。 |
| wraplength | 一段文字超过多少宽度 ( px ) 会换行。 |
| image | 图片内容。 |
| bitmap | 使用 bitmap 图示作为标签内容。 |
| compound | 设定文字与图片排列的方式,可以设定 none、center、top、bottom、left、right,默认 none。 |
下方是 Checkbutton 单选按钮行为相关的参数:
| 参数 | 说明 |
|---|---|
| variable | 绑定哪个变数。 |
| onalue | 勾选该按钮时回传到变数的值,默认 0。 |
| offalue | 取消勾选该按钮时回传到变数的值,默认 0。 |
| command | 按下按钮要执行的函数。 |
| state | 按钮状态,tk.NORMAL 可使用 ( 默认 )、tk.DISABLED 不可使用。 |
Checkbutton 组合文字
下方的程序码除了包含两个 Checkbutton,额外放入一个带有参数 textvariable=val 的 Label 标签,执行后勾选 Checkbutton,就可以看到 Label 标签中出现组合后的文字。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
result = tk.StringVar()
result.set('')
mylabel = tk.Label(root, textvariable=result,
font=('Arial',30), fg='#f00') # 放入標籤
mylabel.pack()
def show():
text = f'{var1.get()}{var2.get()}' # 組合文字
result.set(text) # 設定變數內容
var1 = tk.StringVar()
check_btn1 = tk.Checkbutton(root, text='Apple',
variable=var1, onvalue='Apple', offvalue='',
command=show)
check_btn1.pack()
check_btn1.deselect()
var2 = tk.StringVar()
check_btn2 = tk.Checkbutton(root, text='Banana',
variable=var2, onvalue='Banana', offvalue='',
command=show)
check_btn2.pack()
check_btn2.deselect()
root.mainloop()
invoke() 与 toggle()
建立 Radiobutton 按钮之后,可以使用 invoke() 和 toggle() 方法调用按钮,执行 invoke() 之后等于勾选该颗按钮,toggle() 方法则会切换该按钮的状态 ( 如果勾选就取消勾选,如果取消勾选就勾选 ),延伸上方的程序码,加入一个 Button 按钮,使用 toggle() 方法,在点击按钮时切换第二个 Checkbutton 的勾选状态。
import tkinter as tk
import time
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
result = tk.StringVar()
result.set('')
mylabel = tk.Label(root, textvariable=result, font=('Arial',30), fg='#f00') # 放入標籤
mylabel.pack()
def show():
text = f'{var1.get()}{var2.get()}'
result.set(text)
var1 = tk.StringVar()
check_btn1 = tk.Checkbutton(root, text='Apple',
variable=var1, onvalue='Apple', offvalue='',
command=show)
check_btn1.pack()
check_btn1.deselect()
var2 = tk.StringVar()
check_btn2 = tk.Checkbutton(root, text='Banana',
variable=var2, onvalue='Banana', offvalue='',
command=show)
check_btn2.pack()
check_btn2.deselect()
def toggle():
check_btn2.toggle() # 切換狀態
# 按下按鈕時執行 toggle 函式
btn = tk.Button(root,
text='我是按鈕',
font=('Arial',20,'bold'),
command=toggle
)
btn.pack()
root.mainloop()
微信扫码关注
抖音扫码关注