一、Menubar的基本使用
Menubar是Tkinter中的一個組件,可以在程序的頂部添加菜單欄。通常,菜單欄由多個菜單(Menu)組成,每個菜單中又可以包含多個菜單項(MenuItem),也可以嵌套其他的菜單(CascadeMenu)。
下面是一個簡單的例子,演示如何創建一個包含兩個菜單的菜單欄:
import tkinter as Tk root = Tk.Tk() menubar = Tk.Menu(root) file_menu = Tk.Menu(menubar, tearoff=0) file_menu.add_command(label="New") file_menu.add_command(label="Open") file_menu.add_separator() file_menu.add_command(label="Exit", command=root.quit) edit_menu = Tk.Menu(menubar, tearoff=0) edit_menu.add_command(label="Cut") edit_menu.add_command(label="Copy") edit_menu.add_command(label="Paste") menubar.add_cascade(label="File", menu=file_menu) menubar.add_cascade(label="Edit", menu=edit_menu) root.config(menu=menubar) root.mainloop()
在這段代碼中,我們創建了一個Tkinter窗口,並在它的頂部添加了一個菜單欄。菜單欄中包括了兩個菜單:File和Edit。每個菜單中又包含了若干個菜單項。例如,File菜單中包含了New、Open、Exit三個菜單項。當用戶點擊菜單項時,可以觸發相應的操作(這裡我們為Exit菜單項綁定了root.quit函數,用於退出程序)。
二、改變菜單項的樣式
默認情況下,菜單有一個固定的樣式。我們可以通過改變菜單項的樣式來定製菜單的外觀。
下面是一個例子,演示如何將菜單項的前景色(即文字顏色)設置為紅色:
import tkinter as Tk root = Tk.Tk() menubar = Tk.Menu(root) file_menu = Tk.Menu(menubar, tearoff=0) file_menu.add_command(label="New", foreground="red") file_menu.add_command(label="Open", foreground="red") file_menu.add_separator() file_menu.add_command(label="Exit", command=root.quit, foreground="red") menubar.add_cascade(label="File", menu=file_menu) root.config(menu=menubar) root.mainloop()
在這段代碼中,我們通過為菜單項的foreground參數指定紅色,改變了菜單項的前景色。
三、使用快捷鍵
菜單項可以通過快捷鍵(即快速訪問鍵)來快速觸發操作。在菜單項名稱後面加上 「\t快捷鍵」即可。例如,將Open菜單項的快捷鍵設置為Ctrl-O:
import tkinter as Tk root = Tk.Tk() menubar = Tk.Menu(root) file_menu = Tk.Menu(menubar, tearoff=0) file_menu.add_command(label="New", foreground="red") file_menu.add_command(label="Open\tCtrl-O", foreground="red") file_menu.add_separator() file_menu.add_command(label="Exit", command=root.quit, foreground="red") menubar.add_cascade(label="File", menu=file_menu) root.config(menu=menubar) root.mainloop()
四、使用圖片作為菜單項
我們還可以將圖片(通常是16×16像素的圖標)作為菜單項的背景。使用add_command時,可以為image參數指定一個Tkinter中的photo對象,這個對象可以從一個gif或png文件中創建得到。
下面是一個例子,將Open菜單項替換為一個gif圖標:
import tkinter as Tk root = Tk.Tk() menubar = Tk.Menu(root) photo = Tk.PhotoImage(file="open.gif") file_menu = Tk.Menu(menubar, tearoff=0) file_menu.add_command(label="New", foreground="red") file_menu.add_command(label="Open", image=photo, compound="left", foreground="red") file_menu.add_separator() file_menu.add_command(label="Exit", command=root.quit, foreground="red") menubar.add_cascade(label="File", menu=file_menu) root.config(menu=menubar) root.mainloop()
在這段代碼中,我們通過Tkinter的PhotoImage類創建了一個Photo對象,並將其指定為Open菜單項的背景。通過compound參數,我們可以將這個圖標放在菜單項的最左側。
五、處理菜單項的事件
當菜單項被點擊時,我們可以通過為菜單項的command參數指定一個回調函數,來處理相應的事件。
下面是一個例子,演示如何在用戶點擊New時,在狀態欄中顯示一條消息:
import tkinter as Tk root = Tk.Tk() def on_new(): statusbar.config(text="New Clicked") menubar = Tk.Menu(root) file_menu = Tk.Menu(menubar, tearoff=0) file_menu.add_command(label="New", foreground="red", command=on_new) file_menu.add_command(label="Open", foreground="red") file_menu.add_separator() file_menu.add_command(label="Exit", command=root.quit, foreground="red") menubar.add_cascade(label="File", menu=file_menu) root.config(menu=menubar) statusbar = Tk.Label(root, text="", bd=1, relief=Tk.SUNKEN, anchor=Tk.W) statusbar.pack(side=Tk.BOTTOM, fill=Tk.X) root.mainloop()
在這段代碼中,我們定義了一個名為on_new的回調函數,並將其指定為New菜單項的command參數。在這個回調函數中,我們將狀態欄的文本內容改為「New Clicked」。當用戶點擊New菜單項時,on_new函數將會被調用,從而實現了狀態欄中信息的更新。
六、自定義菜單樣式
我們還可以使用自定義的樣式來改變菜單的外觀。可以使用Tkinter中的Style類來定義不同的樣式。樣式中的各個部分可以通過不同的樣式元素(element)來定義。例如,當我們想要改變菜單項的背景、邊框等屬性時,可以使用element “Menu.Item”來進行定製。
下面是一個例子,演示如何將菜單項的前景色、背景色和邊框樣式進行自定義:
import tkinter as Tk root = Tk.Tk() style = Tk.Style() style.theme_use("clam") style.configure("Kv.Header.TFrame", background="#d9d9d9") style.configure("Kv.Header.TLabel", background="#d9d9d9") style.element_create("Kv.Item.border", "from", "default") style.layout("KvHeader.TFrame", [ ("Kv.Header.TLabel", {"sticky": "wsen"}) ]) style.element_create("Kv.Item.padding", "from", "default") style.layout("Kv.Header.TFrame", [ ("Menu.Item", { "sticky": "w", "children": [ ("Kv.Header.TLabel", { "sticky": "w", "padding": "2 4", }), ("Kv.Item.border", { "border":"1", "sticky": "w", "children": [ ("Kv.Item.padding", { "sticky": "w", "children": [ ("Kv.Header.TLabel", { "sticky": "w", "foreground":"red" }), ] }) ] }) ] }) ]) menubar = Tk.Menu(root, bg="#d9d9d9") root.config(menu=menubar) file_menu = Tk.Menu(menubar, tearoff=0, bg="#d9d9d9", fg="black", bd=1, relief=Tk.FLAT) file_menu.add_command(label="New") file_menu.add_command(label="Open") file_menu.add_separator() file_menu.add_command(label="Exit", command=root.quit) menubar.add_cascade(label="File", menu=file_menu, style="KvHeader.TFrame") root.mainloop()
在這段代碼中,我們首先使用Style類創建了一個名為Kv.Header.TFrame的樣式,用於定義菜單項的外觀。我們使用configure函數來定義了Kv.Header.TFrame中的兩個元素Kv.Header.TLabel和Kv.Item.border的樣式。在layout函數中,我們使用了”Menu.Item”元素,指定了菜單項的樣式結構。在這個結構中,我們使用了名為Kv.Item.padding的元素來定義菜單項的padding樣式。通過為Kv.Header.TLabel指定foreground參數,我們改變了菜單項的前景色。
在代碼的後半部分,我們通過為菜單欄的bg參數、file_menu的bg、fg、bd和relief參數指定不同的值,改變了菜單欄和菜單項的背景色、前景色、邊框顏色等屬性。在add_cascade函數中,我們使用style參數來指定菜單項採用我們自定義的KvHeader.TFrame樣式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/247602.html