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 
 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()

執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM