tkinter-menu詳解

本片文章詳細的介紹tkinter的菜單控件。通過學習本篇文章,你將完全掌握tkinter中菜單的使用。廢話不多說,開始乾貨。

概念

在介紹tkinter菜單之前,我先會介紹3個概念以及這3個概念之間的關係。以便更好的理解後文的表述。

菜單欄(menu bar)、菜單(menu)、菜單項(menu item),三者之間的層次關係如下:

在這裏插入圖片描述

下面這個實例圖,更加的直觀:

在這裏插入圖片描述

對於菜單欄(menu bar)來講,菜單(menu)是其"菜單項";對於菜單(menu)來講,菜單項(menu item)是其"菜單項"。其實代碼層面上就只有menu和menu item的概念,這裏增加了一個菜單欄的邏輯概念是爲了方便表述

在創建菜單欄(menu bar)時,它的master是主窗口對象,然後通過主窗口對象的config函數將兩者(菜單欄、主窗口)關聯起來;在創建菜單(menu)時,這個菜單是 ‘menu’ 還是 ‘menu item’,根據不同的業務需求都是可以實現的。通常來講,這個菜單對應的是’menu’,就像上圖中的Edit菜單,它就是一個’menu’對象,它的master是菜單欄(menu bar)。Edit菜單的菜單項(menu item)是通過相應的方法(後面會具體介紹)將其與菜單關聯起來;使用不同的關聯方法,菜單的顯示效果不同。可能初次看完這段表述,不能完全理解,沒關係,繼續往下看,等看完後面的實際代碼的例子,再回過頭來看這段話,就能完全明白了。

菜單(menu)

創建菜單控件

class Menu(master, cnf=..., **kw)
master 表示父窗口或父菜單
kw 表示菜單控件的各種屬性選項

菜單屬性

下面介紹菜單的14種屬性

屬性 作用
activebackground The background color that will appear on a choice when it is under the mouse.
設置活動背景色。當鼠標移動到菜單選項上時,該菜單項的背景色。
activeborderwidth Specifies the width of a border drawn around a choice when it is under the mouse. Default is 1 pixel.
設置活動邊框寬度。當鼠標移動到菜單選項上時,以指定寬度顯示該選項的邊框。默認寬度是一個像素。最終的效果就是菜單選項的寬度改變。
activeforeground The foreground color that will appear on a choice when it is under the mouse.
設置活動前景色。當鼠標移動到菜單選項上時,該菜單項文字顯示的顏色。
bg The background color for choices not under the mouse.
設置背景色。
bd The width of the border around all the choices. Default is 1.
設置邊框寬度。注意:該效果只有在tearoff子窗口才能顯示出來
cursor The cursor that appears when the mouse is over the choices, but only when the menu has been torn off.
光標的顯示樣式。只有當 tearoff爲1時,在tearoff子窗口中,光標的顯示樣式就會發生變化。
disabledforeground The color of the text for items whose state is DISABLED.
當菜單項的狀態爲DISABLED時,文字的顯示顏色。
font The default font for textual choices.
設置字體
fg The foreground color used for choices not under the mouse.
設置前景色,也就是文字的顏色
postcommand You can set this option to a procedure, and that procedure will be called every time someone brings up this menu.
給菜單設置回調函數,當點擊該菜單時,調用回調。
relief The default 3-D effect for menus is relief=RAISED.
設置3D效果。設置過’flat’, ‘groove’, ‘raised’, ‘ridge’, ‘solid’, 'sunken’都沒有效果。
selectcolor Specifies the color displayed in checkbuttons and radiobuttons when they are selected.
針對checkbutton和radiobutton,如果選中這兩種類型的菜單項,標識的顏色會顯示爲selectcolor設置的顏色。
tearoff Normally, a menu can be torn off, the first position (position 0) in the list of choices is occupied by the tear-off element, and the additional choices are added starting at position 1. If you set tearoff=0, the menu will not have a tear-off feature, and choices will be added starting at position 0.
tearoff的作用就是可以將每個菜單分離出去,單獨形成一個子窗口。通常將tearoff設置爲0。
title Normally, the title of a tear-off menu window will be the same as the text of the menubutton or cascade that lead to this menu. If you want to change the title of that window, set the title option to that string.
設置tear-off子窗口的標題。如果tearoff爲0,不用設置該屬性。

上面瞭解了菜單的15種屬性的作用,有些童鞋會說,好像知道了,但是到底要怎麼使用呢?還是心裏沒底。接下來會針對每一個屬性給出一個小例子,來加深對菜單屬性的理解與使用。

activebackground

def build_file_menu(menu_bar):
    # 設置 活動背景色爲藍色,當鼠標移動到菜單項時,該菜單項的背景變成藍色。
    file_menu = Menu(menu_bar,activebackground='blue')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New")
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

在這裏插入圖片描述

activeforeground

def build_file_menu(menu_bar):
    # 設置 活動前景色爲紅色,當鼠標移動到菜單項時,該菜單項的文字變成紅色。
    file_menu = Menu(menu_bar,activebackground='blue',activeforeground='red')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New")
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

在這裏插入圖片描述

activeborderwidth

def build_file_menu(menu_bar):
    # 設置 活動邊框寬度爲20
    file_menu = Menu(menu_bar,activebackground='blue',activeforeground='red',activeborderwidth=20)
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New")
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

在這裏插入圖片描述

bg

def build_file_menu(menu_bar):
    # 將背景色設置成綠色
    file_menu = Menu(menu_bar,activebackground='blue',activeforeground='red',activeborderwidth=20,
        bg='green')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New")
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

在這裏插入圖片描述

bd

def build_file_menu(menu_bar):
    # bd設置菜單項邊框寬度
    file_menu = Menu(menu_bar,bd=20,bg='green')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New")
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

在這裏插入圖片描述

在這裏插入圖片描述

cursor

該屬性是設置光標的顯示樣式。且只有在tearoff子窗口中,將鼠標移動到菜單項上時,就會顯示相應的光標樣式。樣式有3種,“arrow”(默認),“watch”, “cross”。

arrow就是常見的光標箭頭;

watch 是一個圈一直在轉動;

cross是一個 十字;

因爲不好截圖截不到光標,所以這裏就不展示了,可以自己運行代碼看看實際的效果。

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,cursor="arrow")
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New")
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

disabledforeground

當菜單項的狀態爲DISABLED時,文字的顯示顏色。

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,disabledforeground="blue")
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open")
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

本例中,file_menu設置了disabledforeground爲藍色,將"New"菜單項的state設置爲DISABLED, "New"菜單項的文字變成了藍色。

在這裏插入圖片描述

font

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,disabledforeground="blue")
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open", font=("Courier", 20, "bold"))
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

本例中,將"Open"菜單項的字體設置爲"Courier"、大小爲20、加粗。效果如下:

在這裏插入圖片描述

fg

設置文字的顏色

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,disabledforeground="blue", fg='red')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open", font=("Courier", 20, "bold"))
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

本例中,將菜單項的文字設置爲紅色,效果如下:

在這裏插入圖片描述

postcommand

給菜單設置回調函數,當點擊該菜單時,調用回調。

def postcmd():
    print("call postcmd")

# 創建File menu
def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,postcommand=postcmd)
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open", font=("Courier", 20, "bold"))
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

簡單起見,postcmd函數的實現只是簡單的執行了一個打印,運行該程序後,每次點擊"File"菜單時,postcmd都會被調用。讀者可以自己運行代碼查看效果。

relief

設置3D效果,但是在我的環境中沒有發現明顯的顯示效果。支持6種效果:RAISED=‘raised’

SUNKEN=‘sunken’,FLAT=‘flat’,RIDGE=‘ridge’,GROOVE=‘groove’,SOLID = ‘solid’。這裏僅列出使用方法

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,postcommand=postcmd, relief=tk.SOLID)
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open", font=("Courier", 20, "bold"))
    file_menu.add_command(label="Save")
    file_menu.add_command(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

selectcolor

針對checkbutton和radiobutton,如果選中這兩種類型的菜單項,標識的顏色會顯示爲selectcolor設置的顏色。

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,postcommand=postcmd, relief=tk.SOLID, selectcolor='green')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open", font=("Courier", 20, "bold"))
	# 添加check button菜單項
    file_menu.add_checkbutton(label="Save")
    # 添加radio button菜單項
    file_menu.add_radiobutton(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

下圖中 綠色 的勾,即是selector指定的顏色。
在這裏插入圖片描述

tearoff

前面介紹其他屬性時,其實我們已經用到過tearoff屬性,tkinter默認 tearoff是打開的狀態,也就是可以變成tearoff子窗口。

tearoff 打開時,點擊下圖中的虛線,會彈出一個tearoff子窗口。

在這裏插入圖片描述

tearoff 關閉時,下拉菜單中沒有虛線。

在這裏插入圖片描述

title

設置 tearoff子窗口的title。

def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar,title='tearofftitle')
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加菜單項
    file_menu.add_command(label="New", state=tk.DISABLED)
    file_menu.add_command(label="Open", font=("Courier", 20, "bold"))

    file_menu.add_checkbutton(label="Save")
    file_menu.add_radiobutton(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

在這裏插入圖片描述

ok,菜單屬性就先介紹到這裏,每個屬性的怎麼使用,它的效果是怎樣的?運行實例代碼或者在此基礎上進行改動,多動手,就能熟練掌握菜單的屬性。

菜單方法

前面介紹菜單屬性時,其實用到一些菜單方法,但沒有做過多的解釋,本節將會詳細講解菜單方法。

Menu類的方法有很多,不可能一一列舉,下面僅列出一些常用的方法

  • add_command() 通常用於 給菜單添加普通的菜單項。
  • add_cascade() 通常用於 給menu對象添加一個瀑布菜單,點擊menu對象就會彈出多個菜單項。
  • add_radiobutton() 給菜單添加radiobutton菜單項。
  • add_checkbutton() 給菜單添加checkbutton菜單項
  • add_separator() 給菜單添加分割線
  • add() 給菜單添加指定類型的菜單項,前面5中添加菜單項的方法其實都是在add函數的基礎上做一個封裝。
  • type() 查看菜單項的類型。通常菜單項的類型有"cascade", “checkbutton”, “command”, “radiobutton”, “separator”, “tearoff”。
def build_file_menu(menu_bar):
    file_menu = Menu(menu_bar)
    # 添加瀑布菜單
    menu_bar.add_cascade(label='File', menu=file_menu)
    # 添加普通菜單項
    file_menu.add_command(label="New")
    # 添加普通菜單項
    file_menu.add(tk.COMMAND, label="Open")
    # 添加checkbutton 菜單項
    file_menu.add_checkbutton(label="Save")
    # 添加radiobutton 菜單項
    file_menu.add_radiobutton(label="Save as...")
    file_menu.add_command(label="Close")
    # 添加分割線
    file_menu.add_separator()
    file_menu.add_command(label="Exit")

    print(file_menu.type(0))
    print(file_menu.type(1))
    print(file_menu.type(2))
    print(file_menu.type(3))

運行結果圖:

在這裏插入圖片描述

最後的四行menu item type打印信息 即是對應 18~21行。tkinter支持的menu item type:

import tkinter as tk
tk.CASCADE
tk.CHECKBUTTON
tk.COMMAND
tk.RADIOBUTTON
tk.SEPARATOR

好了,關於tkinter的菜單的知識點就介紹到這裏,如有新的知識點,會更新本文。

最後,附上本文的完整示例代碼。

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