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()
微信扫码关注
抖音扫码关注