2021年9月5日 星期日

Python 內建 GUI 模組 tkinter 測試 (十) : Checkbutton 元件

Tkinter 的 Checkbutton 元件 (稱為核取方塊) 與 Radiobutton 一樣都是選項元件, 但 Checkbutton 是用來建立一組可複選的選項, 它的每一個選項都是獨立的, 不像 Radiobutton 群組每個選項都用同一個 variable 參數綁在一起. 

本系列之前的文章參考 :   


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 類別變數也是用相同的整數鍵存在字典中, 結果與上例一樣 : 




圖形選項

參考 :


沒有留言 :