OptionMenu 下拉選單
OptionMenu 是 tkinter 裡用來讓使用者可以使用「下拉選單」進行選取特定的選項,這篇教學會介紹如何在 tkinter 視窗裡加入 OptionMenu 下拉選單,並實作選取後進行互動的程式。
快速導覽:
因為 Google Colab 不支援 tkinter,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
加入 OptionMenu
建立 tkinter 視窗物件後,透過 OptionMenu 方法,就能在視窗物件中建立 OptionMenu 下拉選單,必要的參數有三個,第一個表示要加入的視窗物件,第二個是 tk 變數,表示選單選擇以及顯示的項目,第三個開始是選單內容 ( 參考 pack 參數設定 ),下方的程式碼執行後,會在視窗裡加入一個具有五個選項的 OptionMenu ( 位置、大小和顏色都使用預設值 )。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
optionList = ['七龍珠','海賊王','鬼滅之刃','灌籃高手','排球少年'] # 選項
value = tk.StringVar() # 取值
value.set('')
menu = tk.OptionMenu(root, value, *optionList) # 第二個參數是取值,第三個開始是選項,使用星號展開
menu.pack()
root.mainloop()
OptionMenu 參數設定
加入 OptionMenu 之後,可以透過 OptionMenu 的參數調整內容的樣式,下方列出 OptionMenu 和其他元件相同的參數:
參數 | 說明 |
---|---|
anchor | 擺放位置,可以設定 n、s、w、e、ne、nw、sw、se、center ( e 右,w 左,s 下,n 上 ),預設 center。 |
width | 寬度,單位是字元數。 |
height | 高度,單位是字元數。 |
bg/background | 背景顏色,可以使用十六進位色碼或顏色名稱。 |
fg/foreground | 文字顏色,可以使用十六進位色碼或顏色名稱。 |
OptionMenu 操作方法
OptionMenu 操作方法和其他元件的用法不同,必須要在外部建立一個變數,透過變數 trace 的方式取值,trace 有兩個參數,第一個是追蹤的模式,第二個是追蹤事件發生後要執行的函式,追蹤模式如下:
模式 | 說明 |
---|---|
w | 當選單的值被更改或選擇。 |
r | 當選單被讀取。 |
u | 當選單被刪除。 |
此外,也因為 OptionMenu 的參數已經提供給選單「內容」使用,因此如果要改變樣式,則必須透過 config 的方式設定,下方的程式執行後,會在選擇 OptionMenu 選項時,印出所選的內容。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def show(*e):
a.set(value.get()) # Label 變數改變成選單內容,使用 get() 取值
a = tk.StringVar() # Label 變數
a.set('七龍珠')
label = tk.Label(root, textvariable=a) # 建立 Label,文字為變數
label.pack()
optionList = ['七龍珠','海賊王','鬼滅之刃','灌籃高手','排球少年']
value = tk.StringVar()
value.set('七龍珠')
menu = tk.OptionMenu(root, value, *optionList) # 選單
menu.config(width=10, fg='#f00') # 設定樣式
menu.pack()
value.trace('w', show) # 變數 trace 是否改變,若有改變執行 show
root.mainloop()
顯示 OptionMenu 選取內容
如果不想用 trace 的方式,也可改用單純點擊 Button 後執行函式的做法,就可以在選單變更後,點擊按鈕顯示選擇內容。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def show(*e):
a.set(value.get())
a = tk.StringVar()
a.set('')
label = tk.Label(root, textvariable=a)
label.pack()
optionList = ['七龍珠','海賊王','鬼滅之刃','灌籃高手','排球少年']
value = tk.StringVar()
value.set('七龍珠')
menu = tk.OptionMenu(root, value, *optionList)
menu.config(width=10, fg='#f00')
menu.pack()
button = tk.Button(root, text='顯示', command=show)
button.pack()
root.mainloop()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~