Menu 選單
使用 tkinter 的 Menu 選單元件,可以在視窗的左上方加入具有功能性的「選單」,這篇教學會介紹如何在 tkinter 中加入 Menu 選單,並透過選單執行一些基本的行為動作。
快速導覽:
因為 Google Colab 不支援 tkinter,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
加入 Menu
建立 tkinter 視窗物件後,透過 Menu 方法,就能在視窗物件中建立 Menu 選單元件,必要的參數有一個,表示要加入的視窗物件,建立 Menu 後,使用 add_command() 方法增加選單項目,如果是 MacOS 作業系統,由於作業系統限制,必須要先建立主選單,再透過 add_cascade() 增加子選單內容。
Windows:
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
menubar = tk.Menu(root) # 建立主選單
menubar.add_command(label="Open") # 主選單項目
menubar.add_command(label="Save") # 主選單項目
menubar.add_command(label="Exit") # 主選單項目
root.config(menu=menubar) # 主視窗加入主選單
root.mainloop()
Mac:
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
menubar = tk.Menu(root) # 建立主選單
filemenu = tk.Menu(menubar) # 建立子選單,選單綁定 menubar 主選單
filemenu.add_command(label="Open") # 子選單項目
filemenu.add_command(label="Save") # 子選單項目
filemenu.add_command(label="Exit") # 子選單項目
menubar.add_cascade(label='File', menu=filemenu) # 建立主選單,內容為子選單
root.config(menu=menubar) # 主視窗加入主選單
root.mainloop()
Menu 常用方法
如果是使用 tkinter 的 Canvas 元件,可以在 Pillow 的 ImageTk.Photoimage 建立 tk 圖片物件後,透過 create_image 方法建立物件。
方法 | 參數 | 說明 |
---|---|---|
add_command() | label, command, image, compound | 選單項目,label 顯示文字,command 執行函式,image 圖示,compound 圖示與文字排列。 |
add_cascade() | label, menu | 父選單,label 顯示文字,menu 內容子選單。 |
add_separator() | 分隔線。 |
加入多層選單
運用 Menu 常用方法,就能做出多層選單的效果,下方的程式碼執行後,會產生兩個主選單,其中第二個選單裡還有額外再一層子選單。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
menu = tk.Menu(root)
menubar_1 = tk.Menu(menu) # 建立第一個選單的子選單,有三個選項
menubar_1.add_command(label="Open") # 子選單第一個選項
menubar_1.add_command(label="Save") # 子選單第二個選項
menubar_1.add_command(label="Exit") # 子選單第三個選項
menu.add_cascade(label='File', menu=menubar_1) # 建立第一個選單 File,綁定子選單
menubar_2 = tk.Menu(menu) # 建立第二個選單的子選單,有三個選項
menubar_2.add_command(label="AAA") # 子選單第一個選項
menubar_2.add_command(label="BBB") # 子選單第一個選項
menubar_2.add_command(label="CCC") # 子選單第一個選項
menubar_2.add_separator() # 子選單分隔線
menubar_2_more = tk.Menu(menubar_2) # 建立子選單內的子選單,有三個選項
menubar_2_more.add_command(label="X") # 子選單的子選單的第一個選項
menubar_2_more.add_command(label="Y") # 子選單的子選單的第二個選項
menubar_2_more.add_command(label="Z") # 子選單的子選單的第三個選項
menubar_2.add_cascade(label='File', menu=menubar_2_more)
menu.add_cascade(label='Test', menu=menubar_2) # 建立第二個選單 File,綁定子選單
root.config(menu=menu) # 綁定選單
root.mainloop()
選單中加入圖示
如果要在選單中加入圖片,則使用 Pillow 函式庫的 ImageTk.Photoimage 建立 tk 圖片物件,再設定選單中的 Image 與 compound 參數,就能在選單中加入圖片 ( 因為 tkinter 的 Photoimage 方法支援度不高又容易失效,所以使用 Pillow 函式庫的 ImageTk.Photoimage 建立 tk 圖片物件 )。
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
img = Image.open("mona.jpg")
img = img.resize((20, 20)) # 縮小尺寸
icon = ImageTk.PhotoImage(img) # 建立圖片物件
menu = tk.Menu(root)
menubar = tk.Menu(menu)
menubar.add_command(label="Open", image=icon, compound='left') # 加入圖片,圖片放在左邊
menubar.add_command(label="Save")
menubar.add_command(label="Exit")
menu.add_cascade(label='File', menu=menubar)
root.config(menu=menu)
root.mainloop()
綁定點擊選單事件
設定建立選單時的 command 參數為指定的函式,就能在點擊選單按鈕時,執行對應的動作,下方的程式碼執行後,點擊 open 和 save 都會印出文字,點擊 exit 按鈕時除了印出文字,還會執行 root.destroy() 關閉視窗的動作。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def open(): print('open')
def save(): print('save')
def exit():
print('exit')
root.destroy()
menu = tk.Menu(root)
menubar = tk.Menu(menu)
menubar.add_command(label="Open", command=open)
menubar.add_command(label="Save", command=save)
menubar.add_command(label="Exit", command=exit)
menu.add_cascade(label='File', menu=menubar)
root.config(menu=menu)
root.mainloop()
加入選單註解
設定 accelerator 參數,可以在選單後方加上快速鍵之類的註解,下方的程式執行後,不僅會在選單後方加上註解,也額外使用 bind_all 的方法,將視窗綁定相同的按鍵事件。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def open(event): print('open')
def save(event): print('save')
def exit(event): print('exit')
menu = tk.Menu(root)
menubar = tk.Menu(menu)
menubar.add_command(label="Open", command=open, accelerator="Command+O")
menubar.add_command(label="Save", command=save, accelerator="Command+S")
menubar.add_command(label="Exit", command=exit, accelerator="Command+E")
menu.add_cascade(label='File', menu=menubar)
root.bind_all("<Command-o>", open)
root.bind_all("<Command-s>", save)
root.bind_all("<Command-e>", exit)
root.config(menu=menu)
root.mainloop()
啟用/停用選單
當選單的 state 參數設定為 normal,表示啟用該選單,設定為 disabled 表示停用該選單 ( 會變成灰色不可點選的文字 ),如果要透過他選單或按鈕啟用,則可以使用 entryconfig() 方法,指定該選單的名稱與 state,就能將其啟用,下方的程式碼執行後,預設 Save 選單處於停用狀態,點擊 Open 選單就會啟用 Save,點擊 Exit 選單就會停用 Save
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def open():
print('open')
menubar.entryconfig('Save', state='normal')
def save(): print('save')
def exit():
print('exit')
menubar.entryconfig('Save', state='disabled')
menu = tk.Menu(root)
menubar = tk.Menu(menu)
menubar.add_command(label="Open", command=open, state="normal")
menubar.add_command(label="Save", command=save, state="disabled")
menubar.add_command(label="Exit", command=exit)
menu.add_cascade(label='File', menu=menubar)
root.config(menu=menu)
root.mainloop()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~