Tkinter 的 Checkbutton 元件 (稱為核取方塊) 與 Radiobutton 一樣都是選項元件, 但 Checkbutton 是用來建立一組可複選的選項, 它的每一個選項都是獨立的, 不像 Radiobutton 群組每個選項都用同一個 variable 參數綁在一起.
本系列之前的文章參考 :
# Python 內建 GUI 模組 tkinter 測試 (一) : 建立視窗
# Python 內建 GUI 模組 tkinter 測試 (二) : 對話框
# Python 內建 GUI 模組 tkinter 測試 (三) : 版面管理員
Checkbutton 元件為一種可複選的選項元件, 其語法如下 :
Checkbutton(父容器, **參數列)
此元件有 tk 與 ttk 版本.
參考 :
Checkbutton 元件常用參數如下表 :
Checkbutton 常用參數 | 說明 |
text | 核取方塊旁的顯示文字, 用來標示選項內容. |
variable | 與 Checkbutton 綁定之變數類別物件名稱, 用來動態存取選項之值 |
command | 當 Checkbutton 狀態改變時要執行的函式名稱 |
width | 元件寬度 (字元數) |
height | 元件高度 (字元數, ttk 不支援) |
padx | 核取方塊與顯示文字之間隔 (px) |
pady | 核取方塊上下之間隔 (px) |
image | 設定選項內容為圖片 (PhotoImage 物件) |
offvalue | 設定選項未被選取時 variable 之值 (預設 0) |
onvalue | 設定選項被選取時 variable 之值 (預設 1) |
最常用的參數是前三個 : text, variable, command. 其中 variable 用來綁定一個類別變數名稱, 預設是用 BooleanVar 或 IntVar, 當核取方塊被選取時其值預設為 True (1), 未被選取時預設是 False(0), 也可以使用 StringVar, 但要配合使用 onvalue 與 offvalue 參數設定狀態值. 例如 :
測試 1 : 核取方塊 tk 版 (1) [看原始碼]
import tkinter as tk
from tkinter import ttk
def show_selection():
selection=[]
if var1.get() == True:
selection.append("英語")
if var2.get() == True:
selection.append("日語")
if var3.get() == True:
selection.append("韓語")
result_label["text"]="選取結果 : " + ",".join(selection)
win=tk.Tk()
win.title("tkinter GUI 測試")
tk.Label(text="外語能力 : ", width=30, background="cyan").pack()
var1=tk.BooleanVar() # 綁定第 1 個選項的類別變數
var1.set(0) # 預設不選取
var2=tk.BooleanVar() # 綁定第 2 個選項的類別變數
var2.set(0) # 預設不選取
var3=tk.BooleanVar() # 綁定第 3 個選項的類別變數
var3.set(0) # 預設不選取
tk.Checkbutton(win, text="英語",
variable=var1,
command=show_selection).pack()
tk.Checkbutton(win, text="日語",
variable=var2,
command=show_selection).pack()
tk.Checkbutton(win, text="韓語",
variable=var3,
command=show_selection).pack()
result_label=tk.Label(text="選取結果 : ", width=30, background="ivory")
result_label.pack()
win.mainloop()
此例為三個 Checkbutton 選項設立各別的 BooleanVar 類別變數, 將其綁定到 variable 參數, 並呼叫 set(0) 方法將每個選項都設為未選取. 透過 command 參數設定在任一選項被選取時呼叫 show_selection() 函式動態顯示目前被選取之項目, 結果如下 :
上例中逐一設定類別變數的做法當選項很多時會使程式碼顯得冗長, 較精簡的作法是使用串列或字典搭配迴圈來處理, 例如 :
測試 2 : 核取方塊 tk 版 (2) [看原始碼]
import tkinter as tk
from tkinter import ttk
def show_selection():
selection=[]
for i in range(0, len(languages)):
if checkvar[i].get() == True:
selection.append(languages[i])
result_label["text"]="選取結果 : " + ",".join(selection)
win=tk.Tk()
win.title("tkinter GUI 測試")
tk.Label(text="外語能力 : ", width=30, background="cyan").pack()
languages=["英語", "日語", "韓語"] #Checkbutton 選項顯示文字
checkvar=[] #用來儲存類別變數
for i in range(0, len(languages)):
checkvar.append(tk.BooleanVar()) #建立 BooleanVar 類別變數並存入串列中
tk.Checkbutton(win, text=languages[i],
variable=checkvar[i],
command=show_selection).pack()
result_label=tk.Label(text="選取結果 : ", width=30, background="ivory")
result_label.pack()
win.mainloop()
此例使用串列儲存選項顯示文字, 利用 for 迴圈走訪串列時建立 BooleanVar 類別變數, 並於建立 Checkbutton 元件時用 variable 參數與該選項綁定, 結果如下 :
下面是測試 2 的 ttk 版 :
測試 3 : 核取方塊 ttk 版 (1) : 使用串列 [看原始碼]
import tkinter as tk
from tkinter import ttk
def show_selection():
selection=[]
for i in range(0, len(languages)):
if checkvar[i].get() == True:
selection.append(languages[i])
result_label["text"]="選取結果 : " + ",".join(selection)
win=tk.Tk()
win.title("tkinter GUI 測試")
ttk.Label(text="外語能力 : ", width=30, background="cyan").pack()
languages=["英語", "日語", "韓語"]
checkvar=[]
for i in range(0, len(languages)):
checkvar.append(tk.BooleanVar())
ttk.Checkbutton(win, text=languages[i],
variable=checkvar[i],
command=show_selection).pack()
result_label=ttk.Label(text="選取結果 : ", width=30, background="ivory")
result_label.pack()
win.mainloop()
此例只是將 Label 與 Checkbutton 全部改為 ttk 版而已, 結果如下 :
也可以使用字典來作為迭代器, 例如 :
測試 4 : 核取方塊 ttk 版 (2) : 使用字典 [看原始碼]
import tkinter as tk
from tkinter import ttk
def show_selection():
selection=[]
for i in range(0, len(languages)):
if checkvar[i].get() == True:
selection.append(languages[i])
result_label["text"]="選取結果 : " + ",".join(selection)
win=tk.Tk()
win.title("tkinter GUI 測試")
ttk.Label(text="外語能力 : ", width=30, background="cyan").pack()
languages={0: "英語", 1: "日語", 2: "韓語"} # 使用字典迭代
checkvar={} # 儲存類別變數用
for i in range(0, len(languages)):
checkvar[i]=tk.BooleanVar()
ttk.Checkbutton(win, text=languages[i],
variable=checkvar[i],
command=show_selection).pack()
result_label=ttk.Label(text="選取結果 : ", width=30, background="ivory")
result_label.pack()
win.mainloop()
此例將各選項的顯示文字用連續整數為鍵組成字典, 迴圈中建立的 Boolean 類別變數也是用相同的整數鍵存在字典中, 結果與上例一樣 :
圖形選項
參考 :
沒有留言:
張貼留言