1. 程式人生 > >GUI的最終選擇 Tkinter(六):選單Menu元件、Menubutton元件、OptionMenu元件

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

執行結果: