我們不難發現,幾乎每一個應用程序都有一些相同的地方,比如說:標題欄、狀態欄、邊框、滾動條、工作區。還有的就是菜單。
傳統的菜單有大家熟悉的File,Edit,Help等,點開之後,是下拉菜單,今天我們就來學習使用tkinter 如何製作這樣子的菜單。tkinter 提供了一個叫做Menu 的組件,主要是用於實現頂級菜單、下拉菜單和彈出菜單。
由於該組件是由底層代碼來實現的,並且已經優化好了,我們這裡不建議你自行通過按鈕或者其他的組件來實現菜單的功能,我知道你可以。但是Python的開發原則就是有得用,你就別自己瞎搞。我說的是正式開發中,在學習中,沒事搞一搞是可以讓我們學習到更多知識的。
我們先來實現創建一個頂級菜單:
-
-
-
-
-
-
-
-
-
menubar.add_command(label = "hello", command = callback)
-
menubar.add_command(label = "quit", command = root.quit)
-
-
root.config(menu = menubar)
-
-
我們接下來實現下拉菜單,我們要實現下拉菜單,例如我們點一下hello,它會出來很多其他的選項,而不是執行一個命令,方法也是大同小異的,只是說下拉菜單我們把它們添加到主菜單上,而不是窗口上,我們舉例說明:
-
-
-
-
-
-
-
-
-
-
-
filemenu = tk.Menu(menubar)
-
-
filemenu.add_command(label = "打开", command = callback)
-
filemenu.add_command(label = "保存", command = callback)
-
-
-
filemenu.add_command(label = "退出", command = root.quit)
-
-
menubar.add_cascade(label = "文件", menu = filemenu)
-
-
-
editmenu = tk.Menu(menubar, tearoff = False)
-
editmenu.add_command(label = "剪切", command = callback)
-
editmenu.add_command(label = "拷贝", command = callback)
-
editmenu.add_command(label = "粘贴", command = root.quit)
-
-
menubar.add_cascade(label = "编辑", menu = editmenu)
-
-
root.config(menu = menubar)
-
-
我們來說一下tearoff 的作用,tearoff 默認為True,顯性特點就是有一點虛線,當我們點擊這一條虛線時:(菜單可以被撕下(tearoff))
我們再來說一個彈出菜單:
-
-
-
-
-
-
-
-
-
-
menubar = tk.Menu(menubar)
-
-
menubar.add_command(label = "撤销", command = callback)
-
menubar.add_command(label = "退出", command = root.quit)
-
-
frame = tk.Frame(root, width =512, height = 512)
-
-
-
-
menubar.post(event.x_root, event.y_root)
-
-
-
frame.bind("<Button-3>", popup)
-
-
運行後,點擊鼠標右鍵:
菜單不僅可以添加我們普通的命令行(add_command),事實上我們還可以添加像Checkbutton(多選按鈕)和Radiobutton(單選按鈕)這樣子的菜單項,它們的用法就和Checkbutton 和Radiobutton 組件是差不多的。
我們繼續創建一個帶有checkbutton 和radiobutton 的菜單給大家看看:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
filemenu = tk.Menu(menubar, tearoff = False)
-
filemenu.add_checkbutton(label = "打开", command = callback, variable = openVar)
-
filemenu.add_checkbutton(label = "保存", command = callback, variable = saveVar)
-
-
filemenu.add_checkbutton(label = "退出", command = root.quit, variable = quitVar)
-
menubar.add_cascade(label = "文件", menu = filemenu)
-
-
-
-
editmenu = tk.Menu(menubar, tearoff = False)
-
editmenu.add_radiobutton(label = "剪切", command = callback, variable = editVar, value = 1)
-
editmenu.add_radiobutton(label = "拷贝", command = callback, variable = editVar, value = 2)
-
editmenu.add_radiobutton(label = "粘贴", command = root.quit, variable = editVar, value = 3)
-
menubar.add_cascade(label = "编辑", menu = editmenu)
-
-
root.config(menu = menubar)
-
-
我們接下來介紹一個新的組件Menubutton。
Menubutton 組件是一個與Menu 組件相關聯的按鈕,(事實上就是Menu + Button),它可以放在窗口中的任意位置,並且在被按下時彈出下拉菜單。
這個組件是有一些歷史意義的,因為剛開始是沒有頂級菜單的,那麼就用Menubutton 實現一個個按鈕在上面,點一個按鈕就出現菜單。
現在該組件適用於你希望菜單按鈕出現在其他位置的時候。
舉個例子:
-
-
-
-
-
-
-
-
mb = tk.Menubutton(root, text = "点我", relief = "raised")
-
-
-
filemenu = tk.Menu(mb, tearoff = False)
-
filemenu.add_command(label = "打开", command = callback)
-
filemenu.add_command(label = "保存", command = callback)
-
-
filemenu.add_command(label = "退出", command = root.quit)
-
-
mb.config(menu = filemenu)
-
-
我們接下來介紹一下Optionmenu(選擇菜單)。
OptionMenu(選擇菜單)事實上是下拉菜單的改版,它的發明彌補了Listbox 組件無法實現下拉列錶框的遺憾。因為事實上創建一個選擇菜單,就跟一個下拉列錶框是一個道理的。我們來看一下它實現的效果就知道了。
-
-
-
-
-
variable = tk.StringVar()
-
-
-
w = tk.OptionMenu(root, variable, "one", "two", "three")
-
-
-
最後,演示一下,如何將很多項添加到選擇菜單中,就是很多選項在一個列表或者元組中,如何將他們添加到OptionMenu 菜單中,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
variable = tk.StringVar()
-
-
-
w = tk.OptionMenu(root, variable, *OPTIONS)
-
-
-
注意:星號(*)作為形參的時候是起到“打包”的作用,相反,作為實參的時候是起到“解包”的作用。
一、星號(*)作為形參,表示調用可變參數函數:
通過在形參前加一個星號(*)或兩個星號(**)來指定函數可以接收任意數量的實參。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
fun2(a=1, b=2, c=3, d=4, e=5)
-
-
-
-
- 從兩個示例的輸出可以看出:當參數形如*args 時,傳遞給函數的任意個實參會按位置打包成一個元組(tuple);
- 當參數形如**args 時,傳遞給函數的任意個key = value 實參會被包裝進一個字典(dict)。
二、星號(*)作為實參時,表示通過解包參數調用函數
有打包就有解包,通過在實參前加一個星號(*)或兩個星號(**)來對列表(list)、元組(tuple)或字典(dict)進行解包:
-
-
-
-
-
-
-
>>> c = {'one':1, 'two':2, 'three':3}
-
-
{'two': 2, 'one': 1, 'three': 3}
-
總結:一個星號(*)用來打包和解包序列,兩個星號(**)用來打包和解包字典。
0 留言:
發佈留言