Python學(xué)習(xí)筆記-第6天:初涉GUI編程

第六天 初涉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類:

  1. Misc:它是所有組件的根父類玫锋。
  2. 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ù).

組件對象的綁定

  1. 通過command屬性綁定(適合簡單不需獲取event對象)

    Button(root,text=”登錄”,command=login)

  2. 通過 bind()方法綁定(適合需要獲取 event 對象)

    c1 = Canvas(); 
    c1.bind(“<Button-1>”,drawLine)
    

組件類的綁定

調(diào)用對象的bind_class函數(shù)啊终,將該組件類所有的組件綁定事件:

w.bind_class(“Widget”,”event”,eventhanler)

菜單和工具欄

主菜單

主菜單一般包含:文件、編輯傲须、幫助等蓝牲,位于GUI窗口的上面。創(chuàng)建主菜單一般有如下4步:

  1. 創(chuàng)建主菜單欄對象

    menubar = tk.Menu(root)

  2. 創(chuàng)建菜單泰讽,并添加到主菜單欄對象

     file_menu = tk.Menu(menubar)
     menubar.add_cascade(label=”文件”,menu=file_menu) 
    
  3. 添加菜單項到 2 步中的菜單

    file_menu.add_command(label=”打開”)
    file_menu.add_command(label=”保 存”,accelerator=”^p command=mySaveFile)
    file_menu.add_separator()
    file_menu.add_command(label=”退出”) 
    
  4. 將主菜單欄添加到根窗口

    root[“menu”]=menubar

上下文菜單

快捷菜單(上下文菜單)是通過鼠標(biāo)右鍵單擊組件而彈出的菜單例衍,一般是和這個組件相關(guān)的操作,比如:剪切已卸、復(fù)制佛玄、粘貼、屬性等累澡。

  1. 創(chuàng)建菜單

    menubar = tk.Menu(root) 
    menubar.add_command(label=”字體”)
    
  2. 綁定鼠標(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)快捷

詳細(xì)設(shè)計

練習(xí)代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主守,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榄融,更是在濱河造成了極大的恐慌参淫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧杯,死亡現(xiàn)場離奇詭異涎才,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)力九,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門耍铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑闺,“玉大人,你說我怎么就攤上這事棕兼《妇耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵伴挚,是天一觀的道長蹭沛。 經(jīng)常有香客問我,道長章鲤,這世上最難降的妖魔是什么摊灭? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮败徊,結(jié)果婚禮上帚呼,老公的妹妹穿的比我還像新娘。我一直安慰自己皱蹦,他們只是感情好煤杀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沪哺,像睡著了一般沈自。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辜妓,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天枯途,我揣著相機(jī)與錄音,去河邊找鬼籍滴。 笑死酪夷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孽惰。 我是一名探鬼主播晚岭,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勋功!你這毒婦竟也來了坦报?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤狂鞋,失蹤者是張志新(化名)和其女友劉穎片择,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體要销,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡构回,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疏咐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤掸。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浑塞,靈堂內(nèi)的尸體忽然破棺而出借跪,到底是詐尸還是另有隱情,我是刑警寧澤酌壕,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布掏愁,位于F島的核電站,受9級特大地震影響卵牍,放射性物質(zhì)發(fā)生泄漏果港。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一糊昙、第九天 我趴在偏房一處隱蔽的房頂上張望辛掠。 院中可真熱鬧,春花似錦释牺、人聲如沸萝衩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猩谊。三九已至,卻和暖如春祭刚,著一層夾襖步出監(jiān)牢的瞬間牌捷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工涡驮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宜鸯,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓遮怜,卻偏偏與公主長得像淋袖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锯梁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353