GUI的最終選擇 Tkinter(六):選單Menu元件、Menubutton元件、OptionMenu元件
Menu元件
今天說的Menu元件就是一些選單元件,開始點點點。。。
Tkinter提供了一個Menu元件,可以實現頂級選單,下拉選單和彈出選單。由於底層是程式碼實現和優化的,所以不太建議通過按鈕和其他元件實現選單功能。
1 from tkinter import * 2 3 root = Tk() 4 def check(): 5 print("被呼叫查看了") 6 def slave(): 7 print("呼叫儲存了") 8 menubar = Menu(root) 9 filemenu = Menu(menubar,tearoff=0) 10 filemenu.add_command(label="儲存",command=slave) 11 filemenu.add_command(label="檢視",command=check) 12 menubar.add_cascade(label="選單",menu=filemenu) 13 root.config(menu=menubar) 14 mainloop()
執行結果:
建立下拉選單(或者其他子選單),方法都是一樣的,只是他們最後都新增到主選單中,而不是視窗上。
1 from tkinter import * 2 3root = Tk() 4 def open(): 5 print("被呼叫open...") 6 def slave(): 7 print("呼叫save...") 8 def cut(): 9 print("被呼叫cut...") 10 def slave(): 11 print("被呼叫slave...") 12 def copy(): 13 print("被呼叫copy...") 14 def paste(): 15 print("被呼叫paste...") 16 menubar = Menu(root)17 #建立一個下拉選單·檔案,然後講臺新增到頂級選單中 18 filemenu = Menu(menubar,tearoff=0) 19 filemenu.add_command(label="儲存",command=slave) 20 filemenu.add_command(label="開啟",command=open) 21 filemenu.add_separator()#下拉選單的分隔線 22 filemenu.add_command(label="退出",command=root.quit) 23 menubar.add_cascade(label="檔案",menu=filemenu) 24 editmenu = Menu(menubar,tearoff=0) 25 editmenu.add_command(label="剪下",command=cut) 26 editmenu.add_command(label="拷貝",command=copy) 27 editmenu.add_command(label="貼上",command=paste) 28 menubar.add_cascade(label="編輯",menu=editmenu) 29 #顯示選單 30 root.config(menu=menubar) 31 mainloop()
執行結果:
這裡需要注意下,在呼叫command後面的函式的時候不能加括號的,因為在執行的時候回從上到下執行一遍,如果新增括號會直接呼叫,不加括號會等待操作後呼叫。
建立一個彈出選單方法也是一致的,不過需要使用post()方法明確地將其顯示出來。
1 from tkinter import * 2 3 root = Tk() 4 menubar = Menu(root) 5 def printItem(): 6 print("popup menu") 7 filemenu = Menu(menubar,tearoff=0) 8 for kk in ["python","php","jave"]: 9 filemenu.add_command(label=kk,command=printItem) 10 filemenu.add_separator() 11 menubar.add_cascade(label="language",menu=filemenu) 12 def popup(event): 13 #顯示選單 14 menubar.post(event.x_root,event.y_root) 15 #在這裡相應滑鼠右鍵事件,右鍵呼叫popup,此時與選單繫結的是root,可以設定為其他的控制元件,在繫結的控制元件上右擊可以彈出選單 16 root.bind("<Button-3>",popup) 17 mainloop()
執行結果:
還有一個就是tearoff方法的用法,上面的例子中我們使用最多的是tearoff=False,如果有興趣可以試下等於True。這是tearoff的用法,也可以用0和1,區別在於,用False的時候第一選單就是Language下有一個橫槓,在右鍵生成的頂端沒有,點選橫槓的時候直接生成一個視窗,如果使用True會生成兩個一級選單一個,二級選單一個。
下面是Menu元件的最後一個用法,不但可以新增單選項的按鈕也可以新增多選按鈕,就是Checkbutton元件和Radiobutton元件類似。
1 from tkinter import * 2 3 root = Tk() 4 def check(): 5 print("python3") 6 menubar = Menu(root) 7 openVar = IntVar() 8 saveVar = IntVar() 9 exitVar = IntVar() 10 filemenu = Menu(menubar,tearoff=1) 11 filemenu.add_checkbutton(label="開啟",command=check,variable=openVar) 12 filemenu.add_checkbutton(label="儲存",command=check,variable=saveVar) 13 #建立一個橫線是退出上面的 14 filemenu.add_separator() 15 filemenu.add_checkbutton(label="退出",command=root.quit,variable=exitVar) 16 #頂級選單名稱 17 menubar.add_cascade(label="檔案",menu=filemenu) 18 editVar = IntVar() 19 editVar.set(1) 20 editmenu = Menu(menubar,tearoff=True) 21 editmenu.add_radiobutton(label="剪下",command=check,variable=editVar,value=1) 22 editmenu.add_radiobutton(label="拷貝",command=check,variable=editVar,value=2) 23 editmenu.add_radiobutton(label="貼上",command=check,variable=editVar,value=3) 24 menubar.add_cascade(label="編輯",menu=editmenu) 25 root.config(menu=menubar) 26 mainloop()
執行結果:
注意:程式執行後點擊頂級選單下的橫槓,會有一個選單,可以單選可以多選。
Menubutton元件
Menubutton元件是一個和Menu元件相關聯的按鈕,Menubutton元件生成的視窗可以放在任意位置,也可以呼叫下拉選單。早期版本的Tkinter會使用Menubutton元件實現頂級選單,但是現在會直接使用Menu元件,因此,如果想自己定義選單按鈕的位置時,可以使用Menubutton元件。
先建立一個Menubutton元件,然後在建立一個Menu元件,讓他們兩個進行關聯。
1 from tkinter import * 2 3 root = Tk() 4 def call(): 5 print(" python3.x") 6 menubar = Menu(root) 7 mb = Menubutton(root,text="python3",relief=RAISED) 8 mb.pack() 9 filemenu = Menu(mb,tearoff=0) 10 filemenu.add_checkbutton(label="開啟",command=call) 11 filemenu.add_command(label="儲存",command=call) 12 filemenu.add_separator() 13 filemenu.add_command(label="退出",command=root.quit) 14 mb.config(menu=filemenu) 15 mainloop()
執行結果:
通過點選“python3”呼叫filemenu,然後進行操作。
OptionMenu元件
OptionMenu(選項選單)說白了就是一個下拉選單的改版,只是彌補了Listbox元件無法實現下拉列表的遺憾。如果想要建立一個選擇選單,只需要一個Tkinter變數即可。
1 from tkinter import * 2 3 root = Tk() 4 root.title("選擇選單") 5 variable = StringVar() 6 variable.set("python") 7 w = OptionMenu(root,variable,"python","php","c#","c++") 8 w.pack() 9 mainloop()
執行結果:
選擇選單建好了,如果想根據自己的選擇進行操作的話,我們可以使用Tkinter變數的get()方法。
1 from tkinter import * 2 3 root = Tk() 4 root.title("選擇選單") 5 variable = StringVar() 6 variable.set("python") 7 def call(): 8 print(variable.get()) 9 w = OptionMenu(root,variable,"python","php","c#","c++") 10 w.pack() 11 Button(root,text="點我",command=call).pack() 12 mainloop()
執行結果:
最後演示一下如何將更多的選項新增到選項選單中:
1 from tkinter import * 2 3 project = ["python3.6","java","go","php"] 4 root = Tk() 5 root.title("選擇選單") 6 variable = StringVar() 7 variable.set("python") 8 def call(): 9 print(variable.get()) 10 w = OptionMenu(root,variable,*project) 11 w.pack() 12 Button(root,text="點我",command=call).pack() 13 mainloop()
執行結果: