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()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~