Spinbox 數值調整元件
Spinbox 是 tkinter 裡用來讓使用者將數值「上下調整」的調整元件,這篇教學會介紹如何在 tkinter 視窗裡加入 Spinbox 數值調整元件,並實作套用改變數值後的簡單應用。
快速導覽:
因為 Google Colab 不支援 tkinter,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
加入 Spinbox
建立 tkinter 視窗物件後,透過 Spinbox 方法,就能在視窗物件中建立 Spinbox 數值調整元件,必要的參數有三個,第一個表示要加入的視窗物件,第二個 from_ 表示起始值,to 表示結束值,最後再用 pack() 方法將其加入視窗中 ( 參考 pack 參數設定 ),下方的程式碼執行後,會在視窗裡加入一個可以調整 0~100 的 Spinbox ( 位置、大小和顏色都使用預設值 )。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
spinbox = tk.Spinbox(root, from_=0, to=100)
spinbox.pack()
root.mainloop()
Spinbox 參數設定
加入 Spinbox 之後,可以透過 Spinbox 的參數調整內容的樣式,下方列出 Spinbox 和其他元件相同的參數:
參數 | 說明 |
---|---|
width | 寬度,單位是字元數,預設 20。 |
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。 |
command | 調整時要執行的函式。 |
disabledbackground | 停用時的背景色。 |
disabledforeground | 停用時的文字顏色。 |
下方是 Spinbox 數值調整元件行為相關的參數:
參數 | 說明 |
---|---|
from_ | 起始值。 |
to | 結數值。 |
increment | 每次可以調整的數值,預設 1。 |
values | 使用 tuple 格式代替 ( from_, to, increment )。 |
activebackground | 正在調整時的背景色可以使用十六進位色碼或顏色名稱。 |
textvariable | 綁定文字變數,存取 Spinbox 數值。 |
wrap | 向上鈕到最大值時是否變為最小值 ( 或到最小時變成最大 ),預設 False,可設定 True。 |
format | 數值格式字串。例如 %10.4f 表示共 10 個數字浮點數含 4 位小數。 |
state | 停用或啟用狀態,預設 normal 啟用,可設定 disables 停用或 readonly 僅可讀取。 |
Spinbox 操作方法
透過下列方法,可以進行 Spinbox 數值調整元件的相關操作:
方法 | 參數 | 說明 |
---|---|---|
index() | index | 定義一個要顯示的數值。 |
get() | 取得目前 Spinbox 的值 ( 文字 )。 | |
invoke() | element | 模擬按上下鍵動作 ( buttonup/buttondown )。 |
調整並即時顯示數值
下方的程式碼執行後,透過 tkinter 的變數,就能讓 Label 即時顯示 Spinbox 改變的數值。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('300x300')
a = tk.StringVar() # 建立 tk 變數
a.set('') # 預設空值
def spin():
val = spinbox.get() # 定義 spin 函式,每當 Spinbox 改變時執行函式
a.set(val) # 改變變數數值
label = tk.Label(root, textvariable=a) # 建立 Label,顯示內容為變數
label.pack()
spinbox = tk.Spinbox(root, from_=0, to=100, command=spin) # 設定 command 為 spin 函式
spinbox.pack()
root.mainloop()
調整並即時進行數字加總
如果有兩個 Spinbox,可以將兩者的 command 都指向同一個函式,獲取兩者的數值後進行運算,下方的程式碼執行後,當 Spinbox 調整時,就會進行即時的數字加總並透過 Label 顯示結果。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('300x300')
a = tk.StringVar()
a.set('0.0')
def spin():
val1 = float(spinbox1.get()) # 將文字轉換成浮點數
val2 = float(spinbox2.get()) # 將文字轉換成浮點數
a.set(val1 + val2) # 數字加總
label = tk.Label(root, textvariable=a)
label.pack()
spinbox1 = tk.Spinbox(root, from_=0, to=100, command=spin)
spinbox1.pack()
spinbox2 = tk.Spinbox(root, from_=0, to=100.0, increment=0.1, command=spin)
spinbox2.pack()
root.mainloop()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~