第六天 初涉GUI編程
在web編程的主流時代炮赦,GUI用的確實不多。學(xué)習(xí)這一塊的目的計劃承上啟下林艘,鞏固下面向?qū)ο缶幊棠钩隆W(xué)習(xí)項目及練習(xí)源碼地址:
GitHub源碼
關(guān)于Pytgon GUI
在昨天的學(xué)習(xí)內(nèi)容里面有提及常用的幾個GUI框架。
圖形用戶界面是由一個個組件組成埋嵌,就像小孩“搭積木”一樣最終組成了整個界面破加。有的組件還能在里面再放置其他組件,我們稱為“容器”雹嗦。
Tkinter編寫一個GUI程序
一般步驟:
創(chuàng)建應(yīng)用程序主窗口對象(也稱:根窗口)
在主窗口中范舀,添加各種可視化組件,比如:按鈕(Button)了罪、文本框(Label)等
通過幾何布局管理器锭环,管理組件的大小和位置
-
事件處理
在組件上綁定各種用戶事件。如:按鈕點(diǎn)擊
from tkinter import * # 最好不要這樣導(dǎo)入所有 from tkinter import messagebox # 為什么要這樣導(dǎo)入一次泊藕,前面已經(jīng)有*了辅辩? def btn_click(e): messagebox.showinfo("Message","按鈕點(diǎn)擊!") print("點(diǎn)擊了按鈕") root = Tk(screenName="Hello World") root.title("GUI開發(fā)練習(xí)") # 設(shè)置標(biāo)題 root.geometry("500x400+100+200") # 設(shè)置畫布大小 btn001 = Button(root) btn001['text'] = "按鈕一" btn001.bind("<Button-1>",btn_click) btn001.pack() # 將按鈕放在畫布上 root.mainloop() # 不這樣窗口打開后自動關(guān)閉
Tkinter常用類介紹
Misc和Wm:
Tkinter的GUI組件有兩個根父類娃圆,它們都直接繼承了object類:
- Misc:它是所有組件的根父類玫锋。
- Wm:它主要提供了一些與窗口管理器通信的功能函數(shù)。
Tk
Misc和Wm派生出子類Tk踊餐,它代表應(yīng)用程序的主窗口景醇。一般應(yīng)用程序都需要直接或間
接使用Tk。
Pack吝岭、Place三痰、Grid
Pack吧寺、Place、Grid 是布局管理器散劫。布局管理器管理組件的:大小稚机、位置。通過布局管 理器可以將容器中的組件實現(xiàn)合理的排布获搏。
BaseWidget
BaseWidget 是所有組件的父類
Widget
Widget是所有組件類的父類赖条。Widget一共有四個父類:BaseWidget、Pack常熙、Grid纬乍、
Place。意味著裸卫,所有GUI組件同時具備這四個父類的屬性和方法仿贬。
GUI應(yīng)用程序類的經(jīng)典寫法
使用面向?qū)ο蟮姆绞剑梢愿雍侠淼慕M織GUI應(yīng)用程序的代碼墓贿。
通過一個App類組織整個GUI程序茧泪,類App繼承了Frame(一個容器組件)及通過繼承擁有了父類的特性。通過構(gòu)造函數(shù) __init__()初始化窗口中的對象聋袋,通過createWidgets()方法創(chuàng)建窗口中的對象队伟。示例代碼
Label標(biāo)簽組件
Label(標(biāo)簽)主要用于顯示文本信息,也可以顯示圖像幽勒。
如果顯示是圖像嗜侮,則以像素為單位。默認(rèn)值是根據(jù)具體顯示的內(nèi)容動態(tài)調(diào)整代嗤。
Options選項
可以通過Options設(shè)置組件的屬性棘钞,從而控制組件的各種狀態(tài)缠借。比如:寬度干毅、高度、顏色泼返、位置等等硝逢。
我們可以通過三種方式設(shè)置Options選項,這在各種GUI組件中用法都一致绅喉。
-
創(chuàng)建對象時渠鸽,使用可變參數(shù)
btn = Button(self, fg="red", bg="blue")
-
創(chuàng)建對象后,使用字典索引方式
btn = Button(self) btn['fg'] = "red" btn['bg'] = "blue"
-
創(chuàng)建對象后柴罐,使用 config()方法
btn = Button(self) btn.config(fg="red", bg="blue")
常見組件屬性一覽
選項名(別名) | 含義 |
---|---|
activebackground | 指定組件處于激活狀態(tài)時的背景色 |
activeforeground | 指定組件處于激活狀態(tài)時的前景色 |
anchor | 指定組件內(nèi)的信息(比如文本或圖片)在組件中如何顯示(當(dāng)所在組件比信息大時徽缚,可以看出效果)。必須為下面的值之一:N革屠、NE凿试、E排宰、SE、S那婉、SW W板甘、NW 或 CENTER。比如 NW(NorthWest)指定將信息顯示在組件的左上角 |
background(bg) | 指定組件正常顯示時的背景色 |
bitmap | 指定在組件上顯示該選項指定的位圖详炬,該選項值可以是Tk_GetBitmap接收的任何形式的位圖盐类。位圖的顯示方式受anchor、justify選項的影響呛谜。如果同時指定了bitmap和text在跳,那么 bitmap 覆蓋文本;如果同時指定了bitmap和image,那么image覆bitmap |
borderwidth | 指定組件正常顯示時的 3D 邊框的寬度隐岛,該值可以是 Tk_GetPixels 接收的任 何格式 |
cursor | 指定光標(biāo)在組件上的樣式硬毕。該值可以是 Tk_GetCursors 接受的任何格式 |
command | 指定按組件關(guān)聯(lián)的命令方法,該方法通常在鼠標(biāo)離開組件時被觸發(fā)調(diào)用 |
disabledforeground | 指定組件處于禁用狀態(tài)時的前景色 |
font | 指定組件上顯示的文本字體 |
foreground(fg) | 指定組件正常顯示時的前景色 |
highlightbackground | 指定組件在高亮狀態(tài)下的背景色 |
highlightcolor | 指定組件在高亮狀態(tài)下的前景色 |
highlightthickness | 指定組件在高亮狀態(tài)下的周圍方形區(qū)域的寬度礼仗,該值可以是 Tk_GetPixels 接收的任何格式 |
height | 指定組件的高度吐咳,以 font 選項指定的字體的字符高度為單位,至少為 1 |
image | 指定組件中顯示的圖像元践,如果設(shè)置了 image 選項韭脊,它將會覆蓋 text、bitmap 選項 |
justify | 指定組件內(nèi)部內(nèi)容的對齊方式单旁,該選項支持 LEFT(左對齊)沪羔、CENTER(居 中對齊)或 RIGHT(右對齊)這三個值 |
padx | 指定組件內(nèi)部在水平方向上兩邊的空白,該值可以是 Tk_GctPixels接收的任何格式 |
pady | 指定組件內(nèi)部在垂直方向上兩地的空白象浑,該值可以是 Tk_GctPixels接收的任何格式指定組件的 3D 效果蔫饰,該選項支持的值包括 RAISED、SUNKEN愉豺、FLAT篓吁、 relief RIDGE、SOLID蚪拦、GROOVE杖剪。該值指出組件內(nèi)部相對于外部的外觀樣式,比如 RAISED 表示組件內(nèi)部相對于外部凸起 |
selectbackground | 指定組件在選中狀態(tài)下的背景色 |
selectborderwidth | 指定組件在選中狀態(tài)下的3D邊框的寬度驰贷,該值可以是Tk_GetPixels接收的任何格式 |
selectforeground | 指定組在選中狀態(tài)下的前景色 |
state | 指定組件的當(dāng)前狀態(tài)盛嘿。該選項支持 NORMAL(正常)、DISABLE(禁用) 這兩個值 |
takefocus | 指定組件在鍵盤遍歷(Tab 或 Shift+Tab)時是否接收焦點(diǎn)括袒,將該選項設(shè)為 1 表示接收焦點(diǎn);設(shè)為 0 表示不接收焦點(diǎn) |
text | 指定組件上顯示的文本次兆,文本顯示格式由組件本身、anchor 及 justify 選 項決定 |
textvariable | 指定一個變量名锹锰,GUI 組件負(fù)責(zé)顯示該變量值轉(zhuǎn)換得到的字符串芥炭,文本顯 示格式由組件本身狈邑、anchor 及 justify 選項決定 |
underline | 指定為組件文本的第幾個字符添加下畫線,該選項就相當(dāng)于為組件綁定了 快捷鍵 |
width | 指定組件的寬度蚤认,以 font 選項指定的字體的字符高度為單位米苹,至少為 1 |
wraplength | 對于能支持字符換行的組件,該選項指定每行顯示的最大字符數(shù)砰琢,超過該 |
Button組件
Button(按鈕)用來執(zhí)行用戶的單擊操作蘸嘶。Button可以包含文本,也可以包含圖像陪汽。按鈕被單擊后會自動調(diào)用對應(yīng)事件綁定的方法训唱。
Entry單行文本框
Entry用來接收一行字符串的控件。如果用戶輸入的文字長度長于Entry控件的寬度時, 文字會自動向后滾動
Text多行文本框
Text(多行文本框)的主要用于顯示多行文本挚冤,還可以顯示網(wǎng)頁鏈接, 圖片, HTML頁面, 甚至 CSS 樣式表况增,添加組件等。因此训挡,也常被當(dāng)做簡單的文本處理器澳骤、文本編輯器或者 網(wǎng)頁瀏覽器來使用。
Radiobutton單選按鈕
Checkbutton復(fù)選按鈕
canvas畫布
canvas(畫布)是一個矩形區(qū)域澜薄,可以放置圖形为肮、圖像、 組件等肤京。
布局管理器
tkinter提供的布局管理器幫助組織颊艳、管理在父組件中子組件的布局方式。tkinter提供了三種管理器:pack忘分、grid棋枕、place。
grid布局管理器
grid表格布局妒峦,采用表格結(jié)構(gòu)組織組件重斑。子組件的位置由
行和列的單元格來確定,并且可以跨行和跨列舟山,從而實現(xiàn)復(fù)
雜的布局
pack布局管理器
pack按照組件的創(chuàng)建順序?qū)⒆咏M件添加到父組件中绸狐,按照垂直或者水平的方向自然排布卤恳。如果不指定任何選項累盗,默認(rèn)在父組件中自頂向下垂直添加組件。
place 布局管理器
place 布局管理器可以通過坐標(biāo)精確控制組件的位置突琳,適用
于一些布局更加靈活的場景
事件處理
一個GUI應(yīng)用整個生命周期都處在一個消息循環(huán) (event
loop) 中若债。它等待事件的發(fā)生,并作出相應(yīng)的處理拆融。
Tkinter提供了用以處理相關(guān)事件的機(jī)制. 處理函數(shù)可被綁 定給各個控件的各種事件蠢琳。
widget.bind(event, handler)
如果相關(guān)事件發(fā)生, handler函數(shù)會被觸發(fā), 事件對象
event會傳遞給handler函數(shù).
組件對象的綁定
-
通過command屬性綁定(適合簡單不需獲取event對象)
Button(root,text=”登錄”,command=login)
-
通過 bind()方法綁定(適合需要獲取 event 對象)
c1 = Canvas(); c1.bind(“<Button-1>”,drawLine)
組件類的綁定
調(diào)用對象的bind_class函數(shù)啊终,將該組件類所有的組件綁定事件:
w.bind_class(“Widget”,”event”,eventhanler)
菜單和工具欄
主菜單
主菜單一般包含:文件、編輯傲须、幫助等蓝牲,位于GUI窗口的上面。創(chuàng)建主菜單一般有如下4步:
-
創(chuàng)建主菜單欄對象
menubar = tk.Menu(root)
-
創(chuàng)建菜單泰讽,并添加到主菜單欄對象
file_menu = tk.Menu(menubar) menubar.add_cascade(label=”文件”,menu=file_menu)
-
添加菜單項到 2 步中的菜單
file_menu.add_command(label=”打開”) file_menu.add_command(label=”保 存”,accelerator=”^p command=mySaveFile) file_menu.add_separator() file_menu.add_command(label=”退出”)
-
將主菜單欄添加到根窗口
root[“menu”]=menubar
上下文菜單
快捷菜單(上下文菜單)是通過鼠標(biāo)右鍵單擊組件而彈出的菜單例衍,一般是和這個組件相關(guān)的操作,比如:剪切已卸、復(fù)制佛玄、粘貼、屬性等累澡。
-
創(chuàng)建菜單
menubar = tk.Menu(root) menubar.add_command(label=”字體”)
-
綁定鼠標(biāo)右鍵單擊事件
def test(event): menubar.post(event.x_root,event.y_root) #在鼠標(biāo)右鍵單擊坐標(biāo)處顯示菜單 root.bind(“<Button-3>”,test) # 在窗體綁定事件
其他組件
OptionMenu選擇項
OptionMenu(選擇項)用來做多選一梦抢,選中的項會在頂部顯
示。
Scale移動滑塊
Scale(移動滑塊)用于在指定的數(shù)值區(qū)間愧哟,通過滑塊的移動來選擇值
顏色選擇框
顏色選擇框可以用來設(shè)置背景色奥吩、前景色、畫筆顏色蕊梧、字體顏色等等圈驼。
文件對話框
文件對話框幫助我們實現(xiàn)可視化的操作目錄、操作文件望几。最后绩脆,將文件、目錄的信息傳入到程序中橄抹。
簡單輸入對話框
simpledialog(簡單對話框)
通用消息框
messagebox(通用消息框)用于和用戶簡單的交互靴迫,用戶點(diǎn)擊確定、取消楼誓。
項目實戰(zhàn)練習(xí)
編寫一個記事本程序
需求分析
模仿windows的記事本玉锌,實現(xiàn)新建、保存等功能疟羹。
- 需要一個主菜單
- 需要一個右鍵菜單
- 最好能響應(yīng)快捷