文章目錄
菜單Menu 設計的基本概念
窗口中一般會有菜單設計,菜單是一種下拉式窗體,在這中窗體中可以設計菜單列表。語法格式如下:
Menu(父對象, options, ...)
參數:
- 第一個參數:
父對象
,表示這個菜單將建立在哪一個窗口內 - 第二個參數:
options
,參數如下
參數 | 含義 |
---|---|
activebackground | 當光標移至此菜單列表上時的背景色彩 |
activeborderwidth | 當被鼠標選取時它的外邊框厚度 默認是1 |
activeforeground | 當光標移至此菜單列表上時的前景色彩 |
bd | 所有菜單列表的外邊框厚度 默認是1 |
bg | 菜單列表未被選取時的背景色彩 |
cursor | 當菜單分離時,鼠標光標在列表上的外觀 |
disabledforeground. | 菜單列表是DISABLED 時的顏色 |
font | 菜單列表文字的字形 |
fg | 菜單列表未被選取時的前景色彩 |
image | 菜單的圖標 |
tearoff | 菜單上方的分割線。這是一個虛線,線條有分割線時tearoff值爲True或1,此時菜單列表從位置1開始放置,同時可以讓菜單分離,分離方式是開啓菜單後單擊分割線 如果將tearoff設爲False或0時,此時不會顯示分割線,也就是菜單無法分離,但是菜單列表將從位置0開始存放 |
add_cascade | 建立分層菜單,同時讓此子功能列表與父菜單建立鏈接 |
add_command | 增加菜單列表 |
add_separator | 增加菜單列表的分隔線 |
菜單Menu 設計的基本應用
例子
:
import tkinter
def show():
label.config(text='I Like Python!')
root = tkinter.Tk()
root.geometry('150x120')
menu = tkinter.Menu(root)
menu.add_command(label='Hello', command=show)
menu.add_command(label='Exit', command=root.destroy)
# 顯示菜單對象
root.config(menu=menu)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
上述程序雖然可以執行,但是這並不是一個正規的菜單設計方式,正規的菜單設計方式是在最上方建立菜單類別
,然後在各個菜單類別內建立相關子菜單列表
,使用下拉式窗體顯示
例子
:
import tkinter
def show():
label.config(text='I Like Python!')
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# 建立菜單類別對象,並將此菜的類別命名file
menuFile = tkinter.Menu(menuBar)
# 建立分層菜單,讓此子功能列表與父菜單建立鏈接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜單內建立菜單列表
menuFile.add_command(label='New', command=show)
menuFile.add_command(label='Exit', command=root.destroy)
# 顯示菜單對象
root.config(menu=menuBar)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
tearoff 參數
由上面的小程序可以看出,下拉子菜單是有分割線的,不符合常理,很影響美觀,這也是tearoff
的默認值導致的,我們把分割線隱藏
例子
:
import tkinter
def show():
label.config(text='I Like Python!')
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# 建立菜單類別對象,並將此菜的類別命名file,tearoff設置爲False
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分層菜單,讓此子功能列表與父菜單建立鏈接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜單內建立菜單列表
menuFile.add_command(label='New', command=show)
menuFile.add_command(label='Exit', command=root.destroy)
# 顯示菜單對象
root.config(menu=menuBar)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
菜單列表間加上分割線
建立下拉菜單列表時,如果列表項目有很多,可以適當的使用add_separator()
方法在菜單列表內加上分割線
例子
:
import tkinter
def show(i):
label.config(text=i)
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# 建立菜單類別對象,並將此菜的類別命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分層菜單,讓此子功能列表與父菜單建立鏈接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜單內建立菜單列表
menuFile.add_command(label='New', command=lambda: show('New'))
menuFile.add_command(label='Open', command=lambda: show('Open'))
menuFile.add_separator()
menuFile.add_command(label='Save', command=lambda: show('Save'))
menuFile.add_command(label='Exit', command=root.destroy)
# 顯示菜單對象
root.config(menu=menuBar)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
建立多個菜單的應用
一個實用的窗口應用程序在最上層menubar
中應該會有很多組菜單類別,在先前的例子中只建立了file菜單的對象,所使用的方法如下:
menuBar = tkinter.Menu(root)
menuFile = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='file', menu=menuFile)
如果想要建立多組菜單類別,所需要的就是增加設計上述第2行和第3行,然後用不同的名稱取代即可
例子
:
import tkinter
def show(i):
label.config(text=i)
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# 建立菜單類別對象,並將此菜的類別命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分層菜單,讓此子功能列表與父菜單建立鏈接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜單內建立菜單列表
menuFile.add_command(label='New', command=lambda: show('New'))
menuFile.add_command(label='Open', command=lambda: show('Open'))
menuFile.add_separator()
menuFile.add_command(label='Save', command=lambda: show('Save'))
menuFile.add_command(label='Exit', command=root.destroy)
menuHelp = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='help', menu=menuHelp)
menuHelp.add_command(label='Help', command=lambda: show('Help'))
# 顯示菜單對象
root.config(menu=menuBar)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
Alt快捷鍵
快捷鍵
是某個菜單類別或是列表指令的英文字符串內爲單一字母增加下劃線,然後可以用Alt鍵先啓動此功能,當菜單顯示下劃線字母時,可以直接按指定字母鍵啓動該功能。設計方式是在下列兩個方法內增加underline
參數
add_cascade(..., underline=n) # n代表第幾個所有字母含下劃線
add_command(..., underline=n) # n代表第幾個所有字母含下劃線
- add_cascade() 的underline是爲菜單類別增加字母下劃線
- add_command() 的underline是爲命令列表增加字母下劃線
上述索引從0開始計算,當然,在將所選擇的字母處理成帶有下劃線時,必須適度選擇具有代表性的字母,通常會是字符串的第1個字母。
例如,F
ile菜單可以選擇F
,H
elp可以選擇H
例子
:
import tkinter
def show(i):
label.config(text=i)
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# 建立菜單類別對象,並將此菜的類別命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分層菜單,讓此子功能列表與父菜單建立鏈接
menuBar.add_cascade(label='file', menu=menuFile, underline=0)
# 在file菜單內建立菜單列表
menuFile.add_command(label='New', command=lambda: show('New'), underline=0)
menuFile.add_command(label='Open', command=lambda: show('Open'), underline=0)
menuFile.add_separator()
menuFile.add_command(label='Save', command=lambda: show('Save'), underline=0)
menuFile.add_command(label='Exit', command=root.destroy, underline=0)
menuHelp = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='help', menu=menuHelp, underline=0)
menuHelp.add_command(label='Help', command=lambda: show('Help'), underline=0)
# 顯示菜單對象
root.config(menu=menuBar)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
按Alt鍵~~
Ctrl + 快捷鍵
在設計菜單列表時,也可以在指令右邊設計Ctrl + X之類的快捷鍵,要設計這類操作可以藉助accelerator參數
,然後再使用bind()方法綁定一起
例子
:
import tkinter
def show(event):
label.config(text=event)
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# 建立菜單類別對象,並將此菜的類別命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分層菜單,讓此子功能列表與父菜單建立鏈接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜單內建立菜單列表
menuFile.add_command(label='New', command=lambda: show('New'), accelerator='Ctrl+N')
# 顯示菜單對象
root.config(menu=menuBar)
root.bind('<Control-n>', lambda event: show('New'))
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
建立子菜單
建立菜單時所使用的的概念如下
menuBar = tkinter.Menu(root)
menuFile = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='file', menu=menuFile)
建立子菜單時,就需要再次嵌套Menu
就行
menuSave = tkinter.Menu(menuFile, tearoff=False)
menuFile.add_cascade(label='Save', menu=menuSave)
menuSave.add_command(label='Save As')
menuSave.add_command(label='Save Local')
例子
:
import tkinter
def show(event):
label.config(text=event)
root = tkinter.Tk()
root.geometry('150x120')
# 建立最上層菜單
menuBar = tkinter.Menu(root)
# file菜單
menuFile = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='file', menu=menuFile)
menuFile.add_command(label='New', command=lambda: show('New'))
# Save菜單與Save子菜單
menuSave = tkinter.Menu(menuFile, tearoff=False)
menuFile.add_cascade(label='Save', menu=menuSave)
menuSave.add_command(label='Save As', command=lambda: show('Save As'))
menuSave.add_command(label='Save Local', command=lambda: show('Save Local'))
menuFile.add_command(label='Exit', command=lambda: show('Exit'))
# 顯示菜單對象
root.config(menu=menuBar)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
建立彈出式菜單
當使用windows操作系統時,可以在桌面上單擊鼠標右鍵,此時會彈出一個菜單,這就是彈出式菜單 Popup menu
,有人將此菜單稱爲快捷菜單
設計這類菜單與先前需要在窗口的menubar區建立菜單類別有一些差異,建立好Menu對象後,可以直接利用此對象建立指令列表,最後的單擊鼠標右鍵操作綁定顯示彈出菜單即可
例子
:
import tkinter
def show(event):
label.config(text=event)
def showInfo(event):
# 顯示彈出式菜單,根據Windows窗口的絕對位置
popupMenu.post(event.x_root, event.y_root)
root = tkinter.Tk()
root.geometry('150x120')
# 建立彈出式菜單對象
popupMenu = tkinter.Menu(root, tearoff=False)
# 彈出菜單內建立兩個指令列表
popupMenu.add_command(label='New File', command=lambda: show('New File'))
popupMenu.add_command(label='Flush', command=lambda: show('Flush'))
# 右鍵綁定彈出菜單方法
root.bind('<Button-3>', showInfo)
label = tkinter.Label(root)
label.pack(padx=5, pady=10)
root.mainloop()
運行結果:
add_checkbutton()
在設計菜單列表時,也可以將命令用複選框
(checkbutton)方式表示。也稱爲Cheak menu button
例子
:
import tkinter
def show():
if demo.get():
# 顯示
label.pack(side=tkinter.BOTTOM, fill=tkinter.X)
else:
# 隱藏
label.pack_forget()
root = tkinter.Tk()
root.geometry('150x120')
menu = tkinter.Menu(root)
fileMenu = tkinter.Menu(menu, tearoff=False)
menu.add_cascade(label='File', menu=fileMenu)
# 創建複選框按鈕
demo = tkinter.BooleanVar()
demo.set(False)
fileMenu.add_checkbutton(label='Save', command=show, variable=demo)
# 創建是否顯示的狀態欄
demoLabel = tkinter.StringVar()
demoLabel.set('顯示')
label = tkinter.Label(root, textvariable=demoLabel, relief='raised')
# 顯示菜單對象
root.config(menu=menu)
root.mainloop()
運行結果:
謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我