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