Tkinter 元件詳解(二):Button
Tkinter 元件詳解之Button
簡介
Button(按鈕)元件用於實現各種各樣的按鈕。Button 元件可以包含文字或影象,你可以將一個 Python 的函式或方法與之相關聯,當按鈕被按下時,對應的函式或方法將被自動執行。
Button 元件僅能顯示單一字型的文字,但文字可以跨越多行。另外,還可以為其中的個別字元加上下劃線(例如用於表示鍵盤快捷鍵)。預設情況下,tab 按鍵被用於在按鈕間切換。
何時使用 Button 元件?
簡而言之,Button 元件是用於讓使用者說:“幹!”,通過按鈕上的文字或圖示讓使用者清楚按下去是幹什麼用的。Button 元件常常被用於工具欄、應用程式視窗、和表示接受或拒絕的對話方塊。Checkbutton 和 Radiobutton
Checkbutton 和 Radiobutton 元件 更適合做資料輸入按鈕使用。
用法
普通的按鈕是非常簡單易用的。你所需要做的就是指定 Button 的內容(文字、點陣圖或者圖片),並且關聯當按鈕被按下時應該呼叫的函式或方法:
import tkinter as tk
master = tk.Tk()
def callback():
print("我被呼叫了!")
b = tk.Button(master, text="執行", command=callback)
b.pack()
master.mainloop()
>>> =============== RESTART=============== 我被呼叫了!
如果一個按鈕沒有相關聯的函式或方法,那麼它就形同虛設。你可能在開發程式的過程中會使用到這樣的按鈕,在這種情況下,更好的方法是禁用這些按鈕,從而避免導致你的測試使用者產生疑惑。
b = tk.Button(master, text="不執行", state="disabled")
如果你沒有指定 Label 的大小,那麼 Label 的尺寸是正好可以容納其內容而已。你可以使用 padx 和 pady 選項在 Button 的內容和邊框間新增額外的間距。
當然你可以通過 height 和 width 選項來明確設定 Button 的大小:如果你顯示的是文字,那麼這兩個選項是以文字單元為單位定義 Button 的大小;如果你顯示的是點陣圖或者影象,那麼它們以畫素為單位(或者其他螢幕單元)定義 Button 大小。
對於內容為文字的 Button 元件,你可以使用畫素為單位指定 Buttton 的尺寸,不過這需要一些技巧。這裡提供一個方法給大家參考(還有其它方法實現):
f = tk.Frame(master, height=64, width=64)
f.pack_propagate(0)
f.pack()
b = tk.Button(f, text="確定", command=callback)
b.pack(fill="both", expand=1)
Button 可以顯示多行文字,你可以直接使用換行符或使用 wraplength 選項來實現。當文字換行的時候,你可以使用 anchor 和 justify 以及 padx 選項來使得文字如你所希望的顯示出來:
longtext = """
我明明只是一個按鈕,
作為按鈕並不需要太多
的文字用於告訴使用者當
我被按下的時候會發生
什麼事情,但我為什麼
這麼長?
"""
b = tk.Button(master, text=longtext, anchor="w", justify="left", padx=2, command=callback)
b.pack()
為了使一個普通的按鈕保持被“按下”的狀態,例如你希望通過某種方式實現一個工具箱(像 Photoshop 左側的工具欄按鈕,按下的時候他保持凹下去,說明你正在使用此工具),你可以簡單的將 relief 選項的預設值 "raised" 改為 "sunken":
b.config(relief="raised")
你或許也希望修改背景色。不過更好的方法是使用 Checkbutton 和 Radiobutton 元件,並把它們的 indicatoron 選項設定為 False:
b = tk.Checkbutton(master, image=bold, variable=var, indicatoron=False)
在早期版本的 Tkinter 中,image 選項會覆蓋 text 選項。也就是說如果你同時指定了兩個選項,那麼只有 image 選項會被顯示。但在新的 Tkinter 中,你可以使用 compound 選項設定二者的混合模式。例如下邊就是通過設定 compound="center" 使得文字位於圖片的上方(重疊顯示):
photo = tk.PhotoImage(file = 'botton.gif')
b = tk.Button(master, text="點我", font = 20, image = photo, compound = "center")
b.pack()
通過 "left","right","top" 和 "bottom" 則可以設定文字在影象的旁邊顯示:
b = tk.Button(master, text="點它 ->", font = 20, image = photo, compound = "right")
引數
Button(master=None, **options) (class)
master -- 父元件
**options -- 元件選項,下方表格詳細列舉了各個選項的具體含義和用法:
選項 | 含義 |
activebackground | 1. 設定當 Button 處於活動狀態(通過 state 選項設定狀態)的背景色 2. 預設值由系統指定 |
activeforeground | 1. 設定當 Button 處於活動狀態(通過 state 選項設定狀態)的前景色 2. 預設值由系統指定 |
anchor | 1. 控制文字(或影象)在 Button 中顯示的位置 2. "n", "ne", "e", "se", "s", "sw", "w", "nw", 或者 "center" 來定位(ewsn 代表東西南北,上北下南左西右東) |
background | 1. 設定背景顏色 2. 預設值由系統指定 |
bg | 跟 background 一樣 |
bitmap | 1. 指定顯示到 Button 上的點陣圖 2. 如果指定了 image 選項,則該選項被忽略 |
borderwidth | 1. 指定 Button 的邊框寬度 2. 預設值由系統指定,通常是 1 或 2 畫素 |
bd | 跟 borderwidth 一樣 |
compound | 1. 控制 Button 中文字和影象的混合模式 3. 如果該選項設定為 "center",文字顯示在影象上(文字重疊影象) |
cursor | 1. 指定當滑鼠在 Button 上飄過的時候的滑鼠樣式 2. 預設值由系統指定 |
default | 1. 如果設定該選項("normal"),該按鈕會被繪製成預設按鈕 2. Tkinter 會根據平臺的具體指標來繪製(通常就是繪製一個額外的邊框) 2. 預設值是 "disable" |
disabledforeground | 1. 指定當 Button 不可用的時候前景色的顏色 2. 預設值由系統指定 |
font | 1. 指定 Button 中文字的字型 2. 一個 Button 只能設定一種字型 3. 預設值由系統指定 |
foreground | 1. 設定 Button 的文字和點陣圖的顏色 2. 預設值由系統指定 |
fg | 跟 foreground 一樣 |
height | 1. 設定 Button 的高度 2. 如果 Button 顯示的是文字,那麼單位是文字單元 3. 如果 Button 顯示的是影象,那麼單位是畫素(或螢幕單元) 4. 如果設定為 0 或者乾脆不設定,那麼會自動根據 Button 的內容計算出高度 |
highlightbackground | 1. 指定當 Button 沒有獲得焦點的時候高亮邊框的顏色 2. 預設值由系統指定 |
highlightcolor | 1. 指定當 Button 獲得焦點的時候高亮邊框的顏色 2. 預設值由系統指定 |
highlightthickness | 1. 指定高亮邊框的寬度 2. 預設值是 0(不帶高亮邊框) |
image | 1. 指定 Button 顯示的圖片 2. 該值應該是 PhotoImage,BitmapImage,或者能相容的物件 3. 該選項優先於 text 和 bitmap 選項 |
justify | 1. 定義如何對齊多行文字 2. 使用 "left","right" 或 "center" |
overrelief | 1. 定義當滑鼠飄過時 Button 的樣式 2. 如果不設定,那麼總是使用 relief 選項指定的樣式 |
padx | 指定 Button 水平方向上的額外間距(內容和邊框間) |
pady | 指定 Button 垂直方向上的額外間距(內容和邊框間) |
relief | 1. 指定邊框樣式 2. 通常當按鈕被按下時是 "sunken",其他時候是 "raised" 3. 另外你還可以設定 "groove"、"ridge" 或 "flat" 4. 預設值是 "raised" |
repeatdelay | 見下方 repeatinterval 選項的描述 |
repeatinterval | 1. 通常當用戶滑鼠按下按鈕並釋放的時候系統認為是一次點選動作。如果你希望當用戶持續按下按鈕的時候(沒有鬆開),根據一定的間隔多次觸發按鈕,那麼你可以設定這個選項。 2. 當用戶持續按下按鈕的時候,經過 repeatdelay 時間後,每 repeatinterval 間隔就觸發一次按鈕事件。 3. 例如設定 repeatdelay=1000,repeatinterval=300,則當用戶持續按下按鈕,在 1 秒的延遲後開始每 300 毫秒觸發一次按鈕事件,直到使用者釋放滑鼠。 |
state | 1. 指定 Button 的狀態 2. 預設值是 "normal" 3. 另外你還可以設定 "active" 或 "disabled" |
takefocus | 1. 指定使用 Tab 鍵可以將焦點移到該 Button 元件上(這樣按下空格鍵也相當於觸發按鈕事件) 2. 預設是開啟的,可以將該選項設定為 False 避免焦點在此 Button 上 |
text | 1. 指定 Button 顯示的文字 2. 文字可以包含換行符 3. 如果設定了 bitmap 或 image 選項,該選項則被忽略 |
textvariable | 1. Button 顯示 Tkinter 變數(通常是一個 StringVar 變數)的內容 2. 如果變數被修改,Button 的文字會自動更新 |
underline | 1. 跟 text 選項一起使用,用於指定哪一個字元畫下劃線(例如用於表示鍵盤快捷鍵) 2. 預設值是 -1 3. 例如設定為 1,則說明在 Button 的第 2 個字元處畫下劃線 |
width | 1. 設定 Button 的寬度 2. 如果 Button 顯示的是文字,那麼單位是文字單元 3. 如果 Button 顯示的是影象,那麼單位是畫素(或螢幕單元) 4. 如果設定為 0 或者乾脆不設定,那麼會自動根據 Button 的內容計算出寬度 |
wraplength | 1. 決定 Button 的文字應該被分成多少行 2. 該選項指定每行的長度,單位是螢幕單元 3. 預設值是 0 |
方法
flash()
-- 重新整理 Button 元件,該方法將重繪 Button 元件若干次(在 "active" 和 "normal" 狀態間切換)。
invoke()
-- 呼叫 Button 中 command 選項指定的函式或方法,並返回函式的返回值。
-- 如果 Button 的state(狀態)是 "disabled"(不可用)或沒有指定 command 選項,則該方法無效。