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 3 root = 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()
執行結果: