我們不難發(fā)現(xiàn),幾乎每一個(gè)應(yīng)用程序都有一些相同的地方,比如說:標(biāo)題欄、狀態(tài)欄、邊框、滾動(dòng)條、工作區(qū)。還有的就是 菜單。
傳統(tǒng)的菜單有大家熟悉的 File,Edit,Help等,點(diǎn)開之后,是下拉菜單,今天我們就來學(xué)習(xí)使用 tkinter 如何制作這樣子的菜單。tkinter 提供了一個(gè)叫做 Menu 的組件,主要是用于實(shí)現(xiàn)頂級(jí)菜單、下拉菜單和彈出菜單。
由于該組件是由底層代碼來實(shí)現(xiàn)的,并且已經(jīng)優(yōu)化好了,我們這里不建議你自行通過按鈕或者其他的組件來實(shí)現(xiàn)菜單的功能,我知道你可以。但是Python的開發(fā)原則就是有得用,你就別自己瞎搞。我說的是正式開發(fā)中,在學(xué)習(xí)中,沒事搞一搞是可以讓我們學(xué)習(xí)到更多知識(shí)的。
我們先來實(shí)現(xiàn)創(chuàng)建一個(gè)頂級(jí)菜單:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
menubar.add_command(label = "hello", command = callback)
-
menubar.add_command(label = "quit", command = root.quit)
-
root.config(menu = menubar)#把創(chuàng)建的 menubar 與根窗口的 menu 綁定,才會(huì)顯示菜單
-
root.mainloop()
我們接下來實(shí)現(xiàn)下拉菜單,我們要實(shí)現(xiàn)下拉菜單,例如我們點(diǎn)一下 hello,它會(huì)出來很多其他的選項(xiàng),而不是執(zhí)行一個(gè)命令,方法也是大同小異的,只是說下拉菜單我們把它們添加到主菜單上,而不是窗口上,我們舉例說明:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
###創(chuàng)建文件菜單
-
filemenu = tk.Menu(menubar)
-
filemenu.add_command(label = "打開", command = callback)
-
filemenu.add_command(label = "保存", command = callback)
-
#我們還創(chuàng)建下拉菜單之間的分割線
-
filemenu.add_separator()
-
filemenu.add_command(label = "退出", command = root.quit)
-
#創(chuàng)建級(jí)聯(lián)菜單
-
menubar.add_cascade(label = "文件", menu = filemenu)
-
###創(chuàng)建編輯菜單
-
editmenu = tk.Menu(menubar, tearoff = False) #tearoff = False ,就是沒有下拉菜單頂部的虛線
-
editmenu.add_command(label = "剪切", command = callback)
-
editmenu.add_command(label = "拷貝", command = callback)
-
editmenu.add_command(label = "粘貼", command = root.quit)
-
#創(chuàng)建級(jí)聯(lián)菜單
-
menubar.add_cascade(label = "編輯", menu = editmenu)
-
root.config(menu = menubar)#把創(chuàng)建的 menubar 與根窗口的 menu 綁定,才會(huì)顯示菜單
-
root.mainloop()
我們來說一下 tearoff 的作用,tearoff 默認(rèn)為 True,顯性特點(diǎn)就是有一點(diǎn)虛線,當(dāng)我們點(diǎn)擊這一條虛線時(shí):(菜單可以被撕下(tearoff))
我們?cè)賮碚f一個(gè)彈出菜單:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
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)
-
frame.pack()
-
def popup(event):
-
menubar.post(event.x_root, event.y_root)
-
frame.bind("<Button-3>", popup) #<Button-3>就是鼠標(biāo)右鍵
-
root.mainloop()
運(yùn)行后,點(diǎn)擊鼠標(biāo)右鍵:
菜單不僅可以添加我們普通的命令行(add_command),事實(shí)上我們還可以添加 像 Checkbutton(多選按鈕)和 Radiobutton(單選按鈕)這樣子的菜單項(xiàng),它們的用法就和? Checkbutton 和 Radiobutton 組件是差不多的。
我們繼續(xù)創(chuàng)建一個(gè)帶有 checkbutton 和 radiobutton 的菜單給大家看看:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
openVar = tk.IntVar()
-
saveVar = tk.IntVar()
-
quitVar = tk.IntVar()
-
filemenu = tk.Menu(menubar, tearoff = False)
-
filemenu.add_checkbutton(label = "打開", command = callback, variable = openVar)
-
filemenu.add_checkbutton(label = "保存", command = callback, variable = saveVar)
-
filemenu.add_separator()
-
filemenu.add_checkbutton(label = "退出", command = root.quit, variable = quitVar)
-
menubar.add_cascade(label = "文件", menu = filemenu)
-
editVar = tk.IntVar()
-
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)
-
root.mainloop()
我們接下來介紹一個(gè)新的組件 Menubutton。
Menubutton 組件是一個(gè)與Menu 組件 相關(guān)聯(lián)的按鈕,(事實(shí)上就是Menu + Button),它可以放在窗口中的任意位置,并且在被按下時(shí)彈出下拉菜單。
這個(gè)組件是有一些歷史意義的,因?yàn)閯傞_始是沒有頂級(jí)菜單的,那么就用 Menubutton 實(shí)現(xiàn)一個(gè)個(gè)按鈕在上面,點(diǎn)一個(gè)按鈕就出現(xiàn)菜單。
現(xiàn)在該組件適用于你希望菜單按鈕出現(xiàn)在其他位置的時(shí)候。
舉個(gè)例子:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
mb = tk.Menubutton(root, text = "點(diǎn)我", relief = "raised")
-
mb.pack()
-
filemenu = tk.Menu(mb, tearoff = False)
-
filemenu.add_command(label = "打開", command = callback)
-
filemenu.add_command(label = "保存", command = callback)
-
filemenu.add_separator()
-
filemenu.add_command(label = "退出", command = root.quit)
-
mb.config(menu = filemenu)
-
root.mainloop()
我們接下來 介紹一下 Optionmenu(選擇菜單)。
OptionMenu(選擇菜單)事實(shí)上是下拉菜單的改版,它的發(fā)明彌補(bǔ)了Listbox 組件無法實(shí)現(xiàn)下拉列表框的遺憾。因?yàn)槭聦?shí)上創(chuàng)建一個(gè)選擇菜單,就跟一個(gè)下拉列表框是一個(gè)道理的。我們來看一下它實(shí)現(xiàn)的效果就知道了。
-
import tkinter as tk
-
root = tk.Tk()
-
variable = tk.StringVar()
-
variable.set("one")
-
w = tk.OptionMenu(root, variable, "one", "two", "three")
-
w.pack()
-
root.mainloop()
最后,演示一下,如何將很多項(xiàng)添加到選擇菜單中,就是很多選項(xiàng)在一個(gè)列表或者元組中,如何將他們添加到 OptionMenu 菜單中,
-
import tkinter as tk
-
OPTIONS = [
-
"Wuhan",
-
"Beijing",
-
"Shanghai",
-
"Tianjin",
-
"Aomen",
-
"Xianggang",
-
"Hankou"
-
]
-
root = tk.Tk()
-
variable = tk.StringVar()
-
variable.set(OPTIONS[0])
-
w = tk.OptionMenu(root, variable, *OPTIONS) #*號(hào)有一個(gè)解包的功能,如果沒有 * 號(hào),就把整個(gè)列表當(dāng)做一個(gè)選項(xiàng)了
-
w.pack()
-
root.mainloop()
注意:星號(hào)(*)作為形參的時(shí)候是起到“打包”的作用,相反,作為實(shí)參的時(shí)候是起到“解包”的作用。
一、星號(hào)(*)作為形參,表示調(diào)用可變參數(shù)函數(shù):
通過在形參前加一個(gè)星號(hào)(*)或兩個(gè)星號(hào)(**)來指定函數(shù)可以接收任意數(shù)量的實(shí)參。
-
def fun1(*args):? ?? ??
-
? ?? ???print(type(args))?
-
? ?? ???print(args)
-
? ?? ???
-
fun1(1, 2, 3, 4, 5)
-
# 輸出:
-
# <class 'tuple'>
-
# (1, 2, 3, 4, 5)
-
def fun2(**args):
-
? ?? ???print(type(args))
-
? ?? ???print(args)
-
? ?? ???
-
fun2(a=1, b=2, c=3, d=4, e=5)
-
# 輸出:
-
# <class 'dict'>
-
# {'e': 5, 'a': 1, 'c': 3, 'd': 4, 'b': 2}
- 從兩個(gè)示例的輸出可以看出:當(dāng)參數(shù)形如 *args 時(shí),傳遞給函數(shù)的任意個(gè)實(shí)參會(huì)按位置打包成一個(gè)元組(tuple);
- 當(dāng)參數(shù)形如 **args 時(shí),傳遞給函數(shù)的任意個(gè) key = value 實(shí)參會(huì)被包裝進(jìn)一個(gè)字典(dict)。
二、星號(hào)(*)作為實(shí)參時(shí),表示通過解包參數(shù)調(diào)用函數(shù)
有打包就有解包,通過在實(shí)參前加一個(gè)星號(hào)(*)或兩個(gè)星號(hào)(**)來對(duì)列表(list)、元組(tuple)或字典(dict)進(jìn)行解包:
-
>>> a = [1, 2, 3, 4, 5]
-
>>> b = (1, 2, 3, 4, 5)
-
>>> fun1(*a)
-
(1, 2, 3, 4, 5)
-
>>> fun1(*b)
-
(1, 2, 3, 4, 5)
-
>>> c = {'one':1, 'two':2, 'three':3}
-
>>> fun2(**c)
-
{'two': 2, 'one': 1, 'three': 3}
-
>>>?
文章來源:http://www.zghlxwxcb.cn/news/detail-617883.html
總結(jié):一個(gè)星號(hào)(*)用來打包和解包序列,兩個(gè)星號(hào)(**)用來打包和解包字典。文章來源地址http://www.zghlxwxcb.cn/news/detail-617883.html
到了這里,關(guān)于《零基礎(chǔ)入門學(xué)習(xí)Python》第073講:GUI的終極選擇:Tkinter10的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!