Python之tkinter 菜單 Menu

菜單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個字母。

例如,File菜單可以選擇FHelp可以選擇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()

運行結果:
在這裏插入圖片描述
謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章