Python Tkinter Menu控件使用詳解

Menu 控件(菜單控件)可以說是 GUI 中“精髓所在”,它以可視化的方式將一系列的命令進行分組,在每一個分組下又可以“隱藏”許多的程序執行命令(即功能)。當打開菜單時,這些命令就會“顯式”的呈現出來,方便用戶進行選擇,比如 Windows 系統中記事本文件(.txt文件類型)的界面:

圖1:Menu菜單界面

通過使用菜單控件(Menu)可以充分地節省有限的窗口區域,讓我們的界面更加簡潔優雅,避免臃腫、混亂。 

Tkinter Menu 控件提供瞭三種類型的菜單,分別是:topleve(主目錄菜單)、pull-down(下拉式菜單)、pop-up(彈出式菜單,或稱快捷式菜單)。

下表列出創建菜單時用到的相關方法,如下所示:

方法 說明
add_cascade(**options) 添加一個父菜單,將一個指定的子菜單,通過 menu 參數與父菜單連接,從而創建一個下拉菜單。
add_checkbutton(**options) 添加一個多選按鈕的菜單項
add_command(**options)  添加一個普通的命令菜單項
add_radiobutton(**options) 添加一個單選按鈕的菜單項
add_separator(**options)  添加一條分割線
add(add(itemType, options)) 添加菜單項,此處 itemType 參數可以是以下幾種:"command"、"cascade",
"checkbutton"、"radiobutton"、"separator" 五種,並使用 options 選項來設置
菜單其他屬性。

除瞭上述方法之外,Menu 控件也提供瞭一些其他方法來操作菜單項,比如刪除菜單項、獲取菜單項、設置指定的菜單項等,如下表所示:

方法 說明
delete(index1, index2=None) 1. 刪除 index1 ~ index2(包含)的所有菜單項
2. 如果忽略 index2 參數,則刪除 index1 指向的菜單項
entrycget(index, option) 獲得指定菜單項的某選項的值
entryconfig(index, **options) 設置指定菜單項的選項
index(index) 返回與 index 參數相應的選項的序號
insert(index, itemType, **options) 插入指定類型的菜單項到 index 參數指定的位置,類型可以是
是:"command","cascade","checkbutton","radiobutton"
或 "separator" 中的一個,或者也可以使用 insert_類型() 形式來,
比如 insert_cascade(index, **options)..等
invoke(index) 調用 index 指定的菜單項相關聯的方法
post(x, y) 在指定的位置顯示彈出菜單
type(index) 獲得 index 參數指定菜單項的類型
unpost() 移除彈出菜單
yposition(index) 返回 index 參數指定的菜單項的垂直偏移位置

下面對 Menu 控件的 options 參數做簡單地介紹,如下所示:

屬性 說明
accelerator 1. 設置菜單項的快捷鍵,快捷鍵會顯示在菜單項目的右邊,比如 accelerator = "Ctrl+O" 表示打開;
2. 註意,此選項並不會自動將快捷鍵與菜單項連接在一起,必須通過按鍵綁定來實現
command 選擇菜單項時執行的 callback 函數
label 定義菜單項內的文字
menu 此屬性與 add_cascade() 方法一起使用,用來新增菜單項的子菜單項
selectcolor 指定當菜單項顯示為單選按鈕或多選按鈕時選擇中標志的顏色
state 定義菜單項的狀態,可以是 normal、active 或 disabled
onvalue/offvalue 1. 默認情況下,variable 選項設置為 1 表示選中狀態,反之設置為 0,設置 offvalue/onvalue 的值可以自定義未選中狀態的值
2. 
tearoff 1. 如果此選項為 True,在菜單項的上面就會顯示一個可選擇的分隔線;
2. 註意:分隔線會將此菜單項分離出來成為一個新的窗口
underline 設置菜單項中哪一個字符要有下畫線
value 1. 設置按鈕菜單項的值
2. 在同一組中的所有按鈕應該擁有各不相同的值
3. 通過將該值與 variable 選項的值對比,即可判斷用戶選中瞭哪個按鈕
variable 當菜單項是單選按鈕或多選按鈕時,與之關聯的變量

創建主目錄菜單

主目錄菜單也稱之為“頂級菜單”,下拉菜單等其他子菜單的都需要建立在“頂級菜單”的基礎之上,下面示例創建瞭一個類似於“記事本”界面的程序,代碼如下:

from tkinter import *
import tkinter . messagebox
#創建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C語言中文網")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網logo.ico')
# 綁定一個執行函數,當點擊菜單項的時候會顯示一個消息對話框
def menuCommand() :
    tkinter.messagebox.showinfo("主菜單欄","你正在使用主菜單欄")
# 創建一個主目錄菜單,也被稱為頂級菜單
main_menu = Menu (win)
#新增命令菜單項,使用 add_command() 實現
main_menu.add_command (label="文件",command=menuCommand)
main_menu.add_command (label="編輯",command=menuCommand)
main_menu.add_command (label="格式",command=menuCommand)
main_menu.add_command (label="查看",command=menuCommand)
main_menu.add_command (label="幫助",command=menuCommand)
#顯示菜單
win.config (menu=main_menu)
win.mainloop()

程序運行結果如下:

圖2:Menu 控件創建主菜單

如上圖所示,當點擊主目錄中的任意一個菜單選項時都會跳出一個消息對話框。

創建下拉菜單

下拉菜單時主菜單的重要組成部分,也是用戶選擇相關命令的重要交互界面,下拉菜單的創建方式也非常簡單,不過需要我們註意,下拉菜單是建立的主菜單(即頂級菜單)的基礎之上的,並非主窗口之上,這一點千萬不要搞混,否則創建下拉菜單會失敗。

下面繼續仿照“記事本”的相關功能來創建下拉菜單,示例如下:

#創建一個下拉式菜單
from tkinter import *
import tkinter .messagebox
#創建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C語言中文網")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網logo.ico')
#創建一個執行函數,點擊下拉菜單中命令時執行
def menuCommand() :
    tkinter .messagebox .showinfo("下拉菜單", "您正在使用下拉菜單功能")
#創建主目錄菜單(頂級菜單)
mainmenu = Menu (win)
#在頂級菜單上新增"文件"菜單的子菜單,同時不添加分割線
filemenu = Menu (mainmenu, tearoff=False)
#新增"文件"菜單的菜單項,並使用 accelerator 設置菜單項的快捷鍵
filemenu.add_command (label="新建",command=menuCommand,accelerator="Ctrl+N")
filemenu.add_command (label="打開",command=menuCommand, accelerator="Ctrl+O")
filemenu.add_command (label="保存",command=menuCommand, accelerator="Ctrl+S")
# 添加一條分割線
filemenu.add_separator ()
filemenu.add_command (label="退出",command=win. quit)
#在主目錄菜單上新增"文件"選項,並通過menu參數與下拉菜單綁定
mainmenu.add_cascade (label="文件",menu=filemenu)
# 將主菜單設置在窗口上
win.config (menu=mainmenu)
# 綁定鍵盤事件,按下鍵盤上的相應的鍵時都會觸發執行函數
win.bind ("<Control-n>",menuCommand)
win. bind ("<Control-N>", menuCommand)
win.bind ("<Control-o>",menuCommand)
win. bind ("<Control-O>", menuCommand)
win. bind ("<Control-s>", menuCommand)
win.bind ("<Control-S>",menuCommand)
# 顯示主窗口
win.mainloop()

程序運行解結果如下:

圖3:Menu 控件下拉菜單

創建彈出菜單欄

彈出式菜單欄,也稱為快捷式菜單欄,比如通過點擊鼠標右鍵彈出一個菜單欄,其中包含一些常用的選項卡,如復制、粘貼等,如下所示:在記事本的空白處點擊鼠標右鍵會彈出一個菜單欄。

圖4:彈出式菜單欄

Tkinter Menu 控件同樣可以是實現上述功能,而且並不復雜,示例如下:

import tkinter as tk
root = tk.Tk()
root.config(bg='#8DB6CD')
root.title("C語言中文網")
root.geometry('400x300')
root.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網logo.ico')
def func():
    print('您通過彈出菜單執行瞭命令')
# 創建一個彈出菜單
menu = tk.Menu(root, tearoff=False)
menu.add_command(label="新建", command=func)
menu.add_command(label="復制", command=func)
menu.add_command(label="粘貼", command=func)
menu.add_command(label="剪切", command=func)
# 定義事件函數
def command(event):
    # 使用 post()在指定的位置顯示彈出菜單
    menu.post(event.x_root, event.y_root)
   
# 綁定鼠標右鍵,這是鼠標綁定事件
# <Button-3>表示點擊鼠標的右鍵,1 表示左鍵,2表示點擊中間的滑輪
root.bind("<Button-3>", command)
root.mainloop()

程序運行結果如下:

圖5:Menu控件彈出菜單

菜單按鈕控件

Menubutton(菜單按鈕控件)是一個與 Menu 控件相關聯的按鈕,當我們按下按鈕的時候下拉菜單就會自動彈出。通過 Menubutton 創建的菜單按鈕可以自由地放置在窗口中的任意位置,從而提高瞭 GUI 界面的靈活性。

下面看一組簡單使用示例:

from tkinter import *
win=Tk()
win.config(bg='#87CEEB')
win.title("C語言中文網")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網logo.ico')
#創建一個菜單按鈕
menubtn=Menubutton(win, text='點擊進行操作', relief='sunk')
# 設置位置(佈局)
menubtn.grid(padx=195, pady=105)
#添加菜單,使用 tearoff 參數不顯示分割線
filemenu=Menu(menubtn,tearoff = False)
filemenu.add_command(label='新建')
filemenu.add_command(label='刪除')
filemenu.add_command(label='復制')
filemenu.add_command(label='保存')
# 顯示菜單,將菜單命令綁定在菜單按鈕對象上
menubtn.config(menu=filemenu)
win.mainloop()

程序運行結果如下:

圖6:Menubutton菜單按鈕

以上就是Python Tkinter Menu控件使用詳解的詳細內容,更多關於Python Tkinter Menu的資料請關註WalkonNet其它相關文章!

推薦閱讀: