帶你走進 @ 機器人時代
Discover 點選上面藍色文字,關注我們
Tkinter Menu 可以說是 GUI 中“精髓所在”,它以可視化的方式将一系列的“功能頁籤”進行分組。
Tkinter Menu 控件提供了三種類型的菜單,分别是:topleve(主目錄菜單)、pull-down(下拉式菜單)、pop-up(彈出式菜單,或稱快捷式菜單)。
先來看代碼:
from tkinter import *
import tkinter.messagebox
import tkinter as tk
w = tk.Tk()
w.title("工作機器人時代-微信公衆平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
def md():
tkinter.messagebox.showinfo("主菜單欄", "你正在使用主菜單欄")
# 建立一個頂級菜單
m = Menu(w)
# 使用 add_command()指令建立菜單
m.add_command(label="建立", command=md)
m.add_command(label="編輯", command=md)
m.add_command(label="進階", command=md)
m.add_command(label="配置", command=md)
m.add_command(label="幫助", command=md)
# 顯示菜單
w.config(menu=m)
w.mainloop()
運作後得到:
如果我們要建立下拉菜單,可以輸入以下代碼:
from tkinter import *
import tkinter as tk
w = tk.Tk()
w.title("工作機器人時代-微信公衆平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
# 建立一個頂級菜單
m = Menu(w)
#新增子菜單
u = Menu (m, tearoff=False)
# 使用 add_command()指令建立菜單
m.add_cascade (label="檔案",menu=u)
m.add_cascade (label="編輯")
m.add_cascade (label="進階")
m.add_cascade (label="配置")
m.add_cascade (label="幫助")
#新增"檔案"菜單的菜單項
u.add_command (label="建立檔案",accelerator="W")
u.add_command (label="建立檔案夾", accelerator="O")
u.add_command (label="儲存檔案",accelerator="S")
# 添加一條分割線
u.add_separator ()
u.add_command (label="退出系統",accelerator="Q",command=w. quit)
# 顯示菜單
w.config(menu=m)
w.mainloop()
運作後得到:
點選檔案,彈出下拉菜單,點選退出系統,程式關閉。下面我們增加代碼,讓滑鼠點選建立檔案或按快捷鍵Ctrl+w鍵的時候彈出對話框:
from tkinter import *
import tkinter.messagebox
import tkinter as tk
w = tk.Tk()
w.title("工作機器人時代-微信公衆平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
def md():
tkinter.messagebox.showinfo("新消息", "你正點選建立檔案")
def md1(x):
#print(x)
tkinter.messagebox.showinfo("新消息", "你正按快捷鍵建立檔案指令")
# 建立一個頂級菜單
m = Menu(w)
#新增子菜單
u = Menu (m, tearoff=False)
# 使用 add_command()指令建立菜單
m.add_cascade (label="檔案",menu=u)
m.add_cascade (label="編輯")
m.add_cascade (label="進階")
m.add_cascade (label="配置")
m.add_cascade (label="幫助")
#新增"檔案"菜單的菜單項
u.add_command (label="建立檔案",command=md,accelerator="W")
u.add_command (label="建立檔案夾", accelerator="O")
u.add_command (label="儲存檔案",accelerator="S")
# 添加一條分割線
u.add_separator ()
u.add_command (label="退出系統",accelerator="Q",command=w. quit)
#捕獲鍵盤事件
w.bind ('<Control-w>',md1)
w.bind ('<Control-W>',md1)
# 顯示菜單
w.config(menu=m)
w.mainloop()
這裡要注意,當鍵盤按鍵的時候會傳回函數一個參數,是以定義函數的時候要寫成def md1(x):而不能寫成def md1(),運作後效果如下:
如果我們想在窗體界面右鍵點選後彈出一個菜單,在w.config(menu=m)前面插入以下代碼:
def fc():
tkinter.messagebox.showinfo("新消息", "您通過彈出菜單執行了指令")
mu = tk.Menu(w, tearoff=False)#定義彈出的菜單
mu.add_command(label="複制", command=fc)
mu.add_command(label="粘貼", command=fc)
mu.add_command(label="剪切", command=fc)
def cod(event):
# 使用 post()在指定的位置顯示彈出菜單
mu.post(event.x_root, event.y_root)
w.bind("<Button-3>", cod)#滑鼠點選右鍵
用fc函數定義彈出菜單中的按鈕事件,用cod函數來定義右鍵點選後顯示彈出菜單:
如果希望在窗體的任意位置布局一個按鈕,當滑鼠點選時彈出操作菜單,參考以下代碼:
from tkinter import *
import tkinter as tk
w = tk.Tk()
w.title("工作機器人時代-微信公衆平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
#建立一個菜單按鈕
mb=Menubutton(w, text='點選進行操作', relief='solid')
# 設定位置(布局)
mb.grid(padx=35, pady=35)
#添加菜單,使用 tearoff 參數不顯示分割線
fm=Menu(mb,tearoff = False)
fm.add_command(label='建立')
fm.add_command(label='删除')
fm.add_command(label='複制')
fm.add_command(label='儲存')
# 顯示菜單,将菜單指令綁定在菜單按鈕對象上
mb.config(menu=fm)
w.mainloop()
運作後得到如下效果:
我們來看看Menu菜單控件都有哪些屬性:
activebackground | 設定活動背景色 |
activeborderwidth | 設定活動邊框寬度 |
activeforeground | 設定活動前景色 |
bg | 設定背景色 |
bd | 設定邊框寬度 |
cursor | 光标的顯示樣式 |
disabledforeground | 菜單項的狀态為DISABLED時的文字顔色 |
font | 設定字型 |
fg | 設定前景色,也就是文字的顔色 |
postcommand | 點選該菜單時,調用回調函數。 |
relief | 設定3D效果 |
selectcolor | 如果選中顯示selectcolor設定的顔色 |
tearoff | 将每個菜單分離出去,單獨形成一個子視窗 |
title | 設定tear-off子視窗的标題 |
除了這些屬性,還有方法:
add_cascade(**options) | 添加一個父菜單,将一個指定的子菜單,通過參數與父菜單連接配接,進而建立一個下拉菜單 |
add_checkbutton(**options) | 添加一個多選按鈕的菜單項 |
add_command(**options) | 添加一個普通的指令菜單項 |
add_radiobutton(**options) | 添加一個單選按鈕的菜單項 |
add_separator(**options) | 添加一條分割線 |
add(add(itemType, options)) | 添加菜單項 此處 itemType 參數: "command" "cascade" "checkbutton" "radiobutton" "separator" 可以使用 options 選項來設定菜單其他屬性 |
delete(index1, index2=None) | 1. 删除 index1 ~ index2(包含)的所有菜單項 2. 如果忽略 index2 參數,則删除 index1 指向的菜單項 |
entrycget(index, option) | 獲得指定菜單項的某選項的值 |
entryconfig(index, **options) | 設定指定菜單項的選項 |
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 參數指定的菜單項的垂直偏移位置 |
index(index) | 傳回與 index 參數相應的選項的序号 |
Menu 控件的 options 參數:
accelerator | 1. 設定菜單項的快捷鍵,會顯示在菜單項目的右邊 2. 注意,必須通過按鍵綁定來實作 |
command | 選擇菜單項時執行的 callback 函數 |
label | 定義菜單項内的文字 |
menu | 此屬性與 add_cascade() 方法一起使用,用來新增菜單項的子菜單項 |
selectcolor | 指定當菜單項顯示為單選按鈕或多選按鈕時選擇中标志的顔色 |
state | 定義菜單項的狀态 可以是 normal、active 或 disabled |
onvalue/offvalue | 預設情況下,variable 選項設定為 1 表示選中狀态 |
tearoff | 設為 True,在菜單項的上面就會顯示一個可選擇的分隔線 |
underline | 設定菜單項中字元的下畫線 |
value | 設定按鈕菜單項的值,通過該值與 variable 選項的值對比,即可判斷使用者選中了哪個按鈕 |
variable | 當菜單項是單選按鈕或多選按鈕時與之關聯的變量 |
堅持學習,每天都能進步一點!