第六天 初涉GUI編程
在web編程的主流時代,GUI用的確實不多。學習這一塊的目的計劃承上啟下,鞏固下面向?qū)ο缶幊?。學習項目及練習源碼地址:
GitHub源碼
關于Pytgon GUI
在昨天的學習內(nèi)容里面有提及常用的幾個GUI框架。
圖形用戶界面是由一個個組件組成,就像小孩“搭積木”一樣最終組成了整個界面。有的組件還能在里面再放置其他組件,我們稱為“容器”。
Tkinter編寫一個GUI程序
一般步驟:
創(chuàng)建應用程序主窗口對象(也稱:根窗口)
在主窗口中,添加各種可視化組件,比如:按鈕(Button)、文本框(Label)等
通過幾何布局管理器,管理組件的大小和位置
-
事件處理
在組件上綁定各種用戶事件。如:按鈕點擊
from tkinter import * # 最好不要這樣導入所有 from tkinter import messagebox # 為什么要這樣導入一次,前面已經(jīng)有*了? def btn_click(e): messagebox.showinfo("Message","按鈕點擊!") print("點擊了按鈕") root = Tk(screenName="Hello World") root.title("GUI開發(fā)練習") # 設置標題 root.geometry("500x400+100+200") # 設置畫布大小 btn001 = Button(root) btn001['text'] = "按鈕一" btn001.bind("<Button-1>",btn_click) btn001.pack() # 將按鈕放在畫布上 root.mainloop() # 不這樣窗口打開后自動關閉
Tkinter常用類介紹
Misc和Wm:
Tkinter的GUI組件有兩個根父類,它們都直接繼承了object類:
- Misc:它是所有組件的根父類。
- Wm:它主要提供了一些與窗口管理器通信的功能函數(shù)。
Tk
Misc和Wm派生出子類Tk,它代表應用程序的主窗口。一般應用程序都需要直接或間
接使用Tk。
Pack、Place、Grid
Pack、Place、Grid 是布局管理器。布局管理器管理組件的:大小、位置。通過布局管 理器可以將容器中的組件實現(xiàn)合理的排布。
BaseWidget
BaseWidget 是所有組件的父類
Widget
Widget是所有組件類的父類。Widget一共有四個父類:BaseWidget、Pack、Grid、
Place。意味著,所有GUI組件同時具備這四個父類的屬性和方法。
GUI應用程序類的經(jīng)典寫法
使用面向?qū)ο蟮姆绞剑梢愿雍侠淼慕M織GUI應用程序的代碼。
通過一個App類組織整個GUI程序,類App繼承了Frame(一個容器組件)及通過繼承擁有了父類的特性。通過構造函數(shù) __init__()初始化窗口中的對象,通過createWidgets()方法創(chuàng)建窗口中的對象。示例代碼
Label標簽組件
Label(標簽)主要用于顯示文本信息,也可以顯示圖像。
如果顯示是圖像,則以像素為單位。默認值是根據(jù)具體顯示的內(nèi)容動態(tài)調(diào)整。
Options選項
可以通過Options設置組件的屬性,從而控制組件的各種狀態(tài)。比如:寬度、高度、顏色、位置等等。
我們可以通過三種方式設置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)的信息(比如文本或圖片)在組件中如何顯示(當所在組件比信息大時,可以看出效果)。必須為下面的值之一: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 | 指定光標在組件上的樣式。該值可以是 Tk_GetCursors 接受的任何格式 |
| command | 指定按組件關聯(lián)的命令方法,該方法通常在鼠標離開組件時被觸發(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 | 指定組件中顯示的圖像,如果設置了 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 | 指定組件的當前狀態(tài)。該選項支持 NORMAL(正常)、DISABLE(禁用) 這兩個值 |
| takefocus | 指定組件在鍵盤遍歷(Tab 或 Shift+Tab)時是否接收焦點,將該選項設為 1 表示接收焦點;設為 0 表示不接收焦點 |
| text | 指定組件上顯示的文本,文本顯示格式由組件本身、anchor 及 justify 選 項決定 |
| textvariable | 指定一個變量名,GUI 組件負責顯示該變量值轉(zhuǎn)換得到的字符串,文本顯 示格式由組件本身、anchor 及 justify 選項決定 |
| underline | 指定為組件文本的第幾個字符添加下畫線,該選項就相當于為組件綁定了 快捷鍵 |
| width | 指定組件的寬度,以 font 選項指定的字體的字符高度為單位,至少為 1 |
| wraplength | 對于能支持字符換行的組件,該選項指定每行顯示的最大字符數(shù),超過該 |
Button組件
Button(按鈕)用來執(zhí)行用戶的單擊操作。Button可以包含文本,也可以包含圖像。按鈕被單擊后會自動調(diào)用對應事件綁定的方法。
Entry單行文本框
Entry用來接收一行字符串的控件。如果用戶輸入的文字長度長于Entry控件的寬度時, 文字會自動向后滾動
Text多行文本框
Text(多行文本框)的主要用于顯示多行文本,還可以顯示網(wǎng)頁鏈接, 圖片, HTML頁面, 甚至 CSS 樣式表,添加組件等。因此,也常被當做簡單的文本處理器、文本編輯器或者 網(wǎng)頁瀏覽器來使用。
Radiobutton單選按鈕
Checkbutton復選按鈕
canvas畫布
canvas(畫布)是一個矩形區(qū)域,可以放置圖形、圖像、 組件等。
布局管理器
tkinter提供的布局管理器幫助組織、管理在父組件中子組件的布局方式。tkinter提供了三種管理器:pack、grid、place。
grid布局管理器
grid表格布局,采用表格結構組織組件。子組件的位置由
行和列的單元格來確定,并且可以跨行和跨列,從而實現(xiàn)復
雜的布局
pack布局管理器
pack按照組件的創(chuàng)建順序?qū)⒆咏M件添加到父組件中,按照垂直或者水平的方向自然排布。如果不指定任何選項,默認在父組件中自頂向下垂直添加組件。
place 布局管理器
place 布局管理器可以通過坐標精確控制組件的位置,適用
于一些布局更加靈活的場景
事件處理
一個GUI應用整個生命周期都處在一個消息循環(huán) (event
loop) 中。它等待事件的發(fā)生,并作出相應的處理。
Tkinter提供了用以處理相關事件的機制. 處理函數(shù)可被綁 定給各個控件的各種事件。
widget.bind(event, handler)
如果相關事件發(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
上下文菜單
快捷菜單(上下文菜單)是通過鼠標右鍵單擊組件而彈出的菜單,一般是和這個組件相關的操作,比如:剪切、復制、粘貼、屬性等。
-
創(chuàng)建菜單
menubar = tk.Menu(root) menubar.add_command(label=”字體”) -
綁定鼠標右鍵單擊事件
def test(event): menubar.post(event.x_root,event.y_root) #在鼠標右鍵單擊坐標處顯示菜單 root.bind(“<Button-3>”,test) # 在窗體綁定事件
其他組件
OptionMenu選擇項
OptionMenu(選擇項)用來做多選一,選中的項會在頂部顯
示。
Scale移動滑塊
Scale(移動滑塊)用于在指定的數(shù)值區(qū)間,通過滑塊的移動來選擇值
顏色選擇框
顏色選擇框可以用來設置背景色、前景色、畫筆顏色、字體顏色等等。
文件對話框
文件對話框幫助我們實現(xiàn)可視化的操作目錄、操作文件。最后,將文件、目錄的信息傳入到程序中。
簡單輸入對話框
simpledialog(簡單對話框)
通用消息框
messagebox(通用消息框)用于和用戶簡單的交互,用戶點擊確定、取消。
項目實戰(zhàn)練習
編寫一個記事本程序
需求分析
模仿windows的記事本,實現(xiàn)新建、保存等功能。
- 需要一個主菜單
- 需要一個右鍵菜單
- 最好能響應快捷