python少儿图形编程_少儿Python编程_第十六讲:图形界面开发
運行在計算機上的程序一般分為命令行程序和圖形界面程序,例如:安裝Python三方模塊的pip命令,軟件版本管理的git命令等都屬于命令行程序;而大多數(shù)軟件使用圖形界面,例如Windows的Word,Excel,畫圖等等軟件都是圖形化用戶界面,簡稱GUI。
在圖形化用戶界面中,用戶可以用鼠標(biāo)操作菜單、按鈕等圖形化組件,并從對話框等圖型化組件中獲取信息。實現(xiàn)圖形化界面的方法與制作游戲界面的流程相似:在初始化工具之后,進入主循環(huán)接收用戶事件,并且進行顯示、反饋等處理,直到程序退出,才結(jié)束主循環(huán)。與繪制游戲界面不同的是,游戲界面中的繪圖、處理鼠標(biāo)事件都需要開發(fā)者寫程序自行處理,而圖形用戶界面內(nèi)部已經(jīng)實現(xiàn)了按鈕、文本框的繪制和響應(yīng)事件,使用時調(diào)用這些控件即可,減少了編寫程序的工作量。
圖形界面在任何編程語言中原理都一樣,本講通過Python圖形界面編程,介紹圖形界面中的基本概念和簡單用法:常用控件、布局方法、事件處理。
16.1 圖形界面入門
Python的圖形用戶界面常使用Tkinter開發(fā),Tcl 是“工具控制語言”的縮寫。Tk是Tcl“圖形工具箱”的擴展,而Tkinter是Tk interface的縮寫,意思是TK界面。
在Windows系統(tǒng)中Tkinter已由Anaconda安裝,可以直接使用,在Linux下則需要使用apt安裝python3-tk軟件包。
16.1.1 基本概念
在學(xué)習(xí)具體編程之前,先了解一些基本概念。
1.控件
控件也叫組件,是圖形用戶界面中最基本的組成部分,常用的控件有:按鈕、文本框、標(biāo)簽、表格等等。
2.容器
容器是一種特殊的控件,它能容納其它控件,如窗口、對話框都屬于容器。
3.布局
布局是控制控件在容器中的大小和位置的方法。
4.事件處理
事件是可以被程序識別的操作,如:按下按鈕,選擇某個單選按鈕或者復(fù)選框,關(guān)閉程序等等,開發(fā)者往往需要對事件做出處理,響應(yīng)某個事件的函數(shù)就是事件處理程序,也被稱為回調(diào)函數(shù)。
16.1.2程序示例
下例是一個簡單的圖形界面程序,它創(chuàng)建窗口。并在窗口中顯示兩行文字“test1”和“test2”。
01 import tkinter
02
03 win = tkinter.Tk()
04 win.geometry("320x240+200+50")
05 tx1 = tkinter.Label(win, text="test1")
06 tx1.pack()
07 tx2 = tkinter.Label(win, text="test2")
08 tx2.pack()
09 win.mainloop()
第01行引入tkinter模塊。
第03行創(chuàng)建一個實例,用于顯示窗口。
第04行設(shè)置窗口大小為:寬度320,高度240,位置在屏幕橫坐標(biāo)200,縱坐標(biāo)50。
第05行創(chuàng)建標(biāo)簽控件tx1用于顯示文字,Label函數(shù)有兩個參數(shù),第一個參數(shù)指定控件所在的容器,第二個參數(shù)text指定標(biāo)簽上顯示的文字。
第06行將控件放置在容器之中,pack是布局的一種方法,將在之后的“布局”部分詳細介紹。
第07-08行創(chuàng)建和放置了第二個標(biāo)簽tx2。
第09行開啟主循環(huán),在窗口關(guān)閉時主循環(huán)退出,程序結(jié)束。
程序運行結(jié)果如圖16.1所示:
16.1 簡單的圖形用戶界面
16.2 布局
布局是把控件放置到容器之中,并且指定放在哪里,以及如何放置。Tkinter有3種基本布局管理器:pack、grid和place,還提供容器Frame支持復(fù)雜的嵌套布局。
16.2.1 常用布局方法
1. pack布局
pack是最常用的布局方法——順序布局,用于按順序添加各個控件,上例中使用pack分別添加了兩個文字標(biāo)簽,可以看到控件按添加的順序依次顯示在窗口中。圖16.2分別展示了橫向和縱向順序布局的方法。
圖16.2 pack布局示意圖
其基本語法如下:
01 控件名.pack(可選參數(shù))
布局的可選參數(shù)如表16.1所示:
表16.1 布局參數(shù)表
2.grid布局
grid按網(wǎng)格擺放控件,如圖16.3所示,其中每個控件的位置都由行索引row和列索引colomn兩個值確定,索引號從0開始(不是1),如左上角的控件1行列為0,0;控件2行列為0,1,以此類推。
圖16.3 grid布局示意圖
其基本語法如下,該函數(shù)也支持表16.1中的參數(shù)。
01 控件名.grid(row=行索引, column=列索引,可選參數(shù))
3.place布局
place按具體坐標(biāo)擺放控件。如圖16.4所示,用x1,y1設(shè)置控件1左上角的位置。
圖16.4 place布局示意圖
其基本用法如下,該函數(shù)也支持表16.1中的參數(shù)。
01 控件名.place(x=橫坐標(biāo), y=縱坐標(biāo),可選參數(shù))
16.2.2 容器布局
當(dāng)界面設(shè)計比較復(fù)雜時,一般使用Frame容器實現(xiàn)布局。Frame譯為框架,它是一種容器,容器是可以包含其它控件的特殊控件。圖16.5在同一窗口中加入了11個控件,包含順序和網(wǎng)格兩種布局方法,實現(xiàn)此界面,需要建立兩個frame容器,一個容器為深色背景,用于存放控件1和控件2,另一個容器為淺灰色背景,用于存放其它網(wǎng)絡(luò)布局的控件。Frame本身也是控件,兩個frame控件也使用了順序布局。
圖16.5 frame容器示意圖
其基本語法如下。
01 f= Frame(父容器,可選參數(shù))
以上程序創(chuàng)建了容器f,之后可以將其它控件加入該容器?!案?子”用于描述容器和控件之間的關(guān)系,通常將包含其它控件的容器稱為“父”,而被包含的控件被稱為“子”。
16.2.3 綜合實例
本例中使用了pack、grid、place、frame多種方法布局界面。
01 import tkinter
02
03 win = tkinter.Tk()
04 win.geometry("320x240+200+50")
05
06 f1 = tkinter.Frame(win)
07 f1.pack()
08 f2 = tkinter.Frame(win)
09 f2.pack()
10
11 tx1 = tkinter.Label(f1, text="test1")
12 tx1.grid(row=0,column=0)
13 tx2 = tkinter.Label(f1, text="test2")
14 tx2.grid(row=1,column=1)
15 tx3 = tkinter.Label(f2, text="test3")
16 tx3.pack()
17 tx4 = tkinter.Label(win, text="test4")
18 tx4.place(x=10,y=10)
19
20 win.mainloop()
第01-04行用于引入模塊和創(chuàng)建窗口。
第06行創(chuàng)建容器f1,并指定其父容器為窗口。
第07行用pack方法將容器以順序方式布局。
第08-09行建立并加入了第二個容器f2。
第11行創(chuàng)建標(biāo)簽控件tx1,設(shè)置其父容器為f1。
第12行用網(wǎng)格方式布局tx1顯示在網(wǎng)格的第0行0列。
第13-14行創(chuàng)建標(biāo)簽控件tx2,并以網(wǎng)格方式布局tx2顯示在網(wǎng)格的第1行1列。
第15行創(chuàng)建標(biāo)簽tx3,設(shè)置其父容器為f2。
第16行用順序方式將控件tx3布局到其父容器中。
第17行創(chuàng)建標(biāo)簽tx4,設(shè)置其父容器為窗口win。
第18行用指定具體位置的方式將控件布局到窗口的坐標(biāo)為(10,10)位置上。
第20行開啟主循環(huán),在窗口關(guān)閉時主循環(huán)退出,程序結(jié)束。
程序運行結(jié)果如圖16.7所示,其中深灰色部分為容器f2,淺灰色部分為容器f1,它們大小不同是由于容器大小等于其子控件大小。f1中子控件更多,因此區(qū)域更大。
圖16.6 布局綜合實例運行結(jié)果
16.3 控件
Tkinter除了標(biāo)簽控件Label,還支持很多其它控件,本節(jié)將介紹最為常用的:按鈕、輸入框、選擇框、以及顯示圖片的控件。
16.3.1 常用控件
1.標(biāo)簽
標(biāo)簽控件用于顯示文字或者圖片,定義方法如下:
01 tkinter.Label(父容器, [可選參數(shù)])
控件常用的可選參數(shù)如表16.2所示:
表16.2 控件常用參數(shù)
2.按鈕
按鈕控件是最常用的控件,例如對話框中的“確定”、“取消”都用按鈕控件實現(xiàn)。定義方法如下:
01 tkinter.Button(父容器, [可選參數(shù)])
3.輸入框
輸入框顯示為矩形框,供用戶輸入信息使用。定義方法如下:
01 tkinter.Entry(父容器, [可選參數(shù)])
4.選擇框
一般情況下,選擇框前面是一個矩形方框,后面跟隨說明文字,例如:讓用戶選擇“婚否”,結(jié)婚則在矩形方框中打鉤,否則留空。定義方法如下:
01 tkinter.Checkbutton(父容器, [可選參數(shù)])
5.圖片
圖片不直接作為控件使用,而是作為標(biāo)簽或者其它控件的背景,如果不設(shè)置標(biāo)簽文字,只設(shè)置其背景圖片,則該標(biāo)簽是一個圖片標(biāo)簽。圖片的加載方法如下:
01 tkinter.PhotoImage(file=圖片路徑)
圖片加載后,可放在控件的可選參數(shù)image中使用。
16.3.2 獲取和設(shè)置控件的屬性
屬性指的是控件的性質(zhì),一般在創(chuàng)建控件時指定,如:控件的寬度width,高度height等,查看控件的屬性方法類似于訪問字典,具體方法如下:
01 控件變量名[屬性名]
使用configure方法可以重新設(shè)置控件屬性值,使用方法如下:
01 控件變量名.configure(屬性名=屬性值)
下例是操作屬性的實際應(yīng)用:
01 x = tkinter.Label(win, text=”abcd”)
02 print(x[‘text’])
03 x.configure(text=’efg’)
第01行建立了標(biāo)簽控件,并設(shè)置標(biāo)簽顯示的文字:text屬性為“abcd”。
第02行顯示出控件變量x的text屬性。
第03行修改控件變量x的text屬性為“efg”。
16.3.3 綜合實例
下面通過綜合實例,進一步鞏固本節(jié)中介紹的各個控件的用法。
01 import tkinter
02
03 win = tkinter.Tk()
04 label = tkinter.Label(win,text="請?zhí)畋?#34;) # 創(chuàng)建文字標(biāo)簽控件
05 label.pack()
06 img = tkinter.PhotoImage(file='bird.png') # 加載圖片
07 label_img = tkinter.Label(win,image=img) # 創(chuàng)建圖片標(biāo)簽控件
08 label_img.pack()
09 entry = tkinter.Entry(win) # 創(chuàng)建輸入框控件
10 entry.pack()
11 check = tkinter.Checkbutton(win,text="婚否") # 創(chuàng)建選擇框控件
12 check.pack(anchor='w')
13 button = tkinter.Button(win, text="退出") # 創(chuàng)建按鈕控件
14 button.pack()
15 win.mainloop()
程序運行結(jié)果如圖16.7所示:
16.7 控件綜合實例運行結(jié)果
課后練習(xí):(練習(xí)答案見本講最后的小結(jié)部分)
練習(xí)一:繪制如圖16.8所示的計算器界面,其中上方用Label顯示輸入數(shù)值和計算結(jié)果,下方提供12個按鈕用于輸入數(shù)字和符號。
圖16.8 計算器效果圖
16.4 事件處理
程序需要接收用戶操作,并進行反饋。用戶操作和系統(tǒng)發(fā)來的信息統(tǒng)稱事件,事件又分為兩種,一種是與整個窗口相關(guān)的事件,比如關(guān)閉窗口,另一種是與單個控件相關(guān)的事件,比如按下按鈕Button產(chǎn)生的事件。
16.4.1 控件事件處理
在創(chuàng)建按鈕時,可通過command參數(shù)設(shè)置當(dāng)按鈕按下時調(diào)用的函數(shù),即事件響應(yīng)函數(shù),用法如下例所示:
01 def do_1():
02 print("按下1")
03
04 bt=tkinter.Button(win, text='1',command=do_1)
05 bt.pack()
第01-02行定義了事件的響應(yīng)函數(shù)do_1,并在函數(shù)中顯示字符串“按下1”。
第04行創(chuàng)建按鈕控件,并指定按下按鈕時調(diào)用函數(shù)do_1(注意:本行do_1函數(shù)并未被調(diào)用)。
16.4.2 窗口事件處理
在創(chuàng)建按鈕時,可通過protocol設(shè)置窗口相關(guān)事件的響應(yīng)函數(shù)。下例為設(shè)置窗口關(guān)閉事件,在窗口關(guān)閉時自動調(diào)用fun1函數(shù)。
01 import tkinter
02
03 def func1():
04 print("關(guān)閉窗口")
05 win.destroy()
06
07 win = tkinter.Tk()
08 win.geometry("400x400+200+50")
09 win.protocol("WM_DELETE_WINDOW",func1)
10
11 win.mainloop()
第03行定義事件響應(yīng)函數(shù)fun1。
第04行顯示字符串"關(guān)閉窗口"。
第05行調(diào)用窗口的destroy方法銷毀窗口。
第09行設(shè)置在窗口關(guān)閉時調(diào)用自定義函數(shù)fun1,即關(guān)聯(lián)事件和響應(yīng)函數(shù)。
課后練習(xí):
練習(xí)二:繼續(xù)完成上題中計算器程序,響應(yīng)用戶按下各個按鈕的事件,更新Label顯示算式,在用戶按下”=”按鈕時,計算算式結(jié)果。
(提示:Python的eval函數(shù)用于執(zhí)行字符串表達式,例如eval(“1+2”)的結(jié)果為3;十二個按鈕功能類似,建議先將其中一兩個按鈕調(diào)試正常后,用復(fù)制粘貼的方法實現(xiàn)其它按鈕,以免在調(diào)試過程中反復(fù)修改)。
16.5 思維訓(xùn)練
16.5.1 眼中的世界
人們對客觀事物比如什么是一、二、三、花、草、樹木有著類似的理解,有了這些共識,可以通過語言來溝通;這也讓我們誤認(rèn)為,每個人眼中的世界都是相同的。
然而,“一千個讀者眼里有一千個哈姆雷特”,不僅是故事,人們對單個文字的理解也不盡相同。對于什么是“愛”,什么是“道德”,這些并非具體可見的事物,由于文化和經(jīng)歷不同,大家的理解也不盡相同,越是不能用語言描述的感覺,差異可能越大。
為什么有些笑話,只有大人才覺得有趣,因為孩子并不知道很多語言的二義性以及背后的引申含義,藝術(shù)家激活了大家擁有的共同體驗,它們又往往是不可言喻的。引領(lǐng)著讀者的思維在具體文字圖像和感覺之間跳躍。
語言是一種抽象的符號,是人們交流的工具,卻不是現(xiàn)實或思維本身。任何事物或者詞匯的意義都取決于它與其它事物的關(guān)系,從而形成了腦中復(fù)雜的關(guān)系網(wǎng)絡(luò),而不是簡單的字典上的定義。
16.5.2 用語言思考
在表達的過程中,思維本身也在變化,表達過程中可能創(chuàng)造出一些新的想法,這就是“用語言思考”。對于復(fù)雜的內(nèi)容,無法用語言描述它的所有細節(jié),在表達的過程中,必然經(jīng)過提煉和簡化,這也重構(gòu)了思維狀態(tài)。因此,有時候向別人提問的過程中,自己就找到了答案。
語言的結(jié)構(gòu)以鏈?zhǔn)綖橹?#xff0c;而思維內(nèi)部一般是網(wǎng)狀連接,描述過程是將一團相互糾纏的細網(wǎng)拆解成為一條主鏈。當(dāng)一個人用語言的標(biāo)號代替一套復(fù)雜的結(jié)構(gòu),就可能建立和處理更加復(fù)雜的內(nèi)容。想要利用語言在他人腦中重建自己腦中的思維結(jié)構(gòu),必須掌握網(wǎng)狀和鏈狀結(jié)構(gòu)相互轉(zhuǎn)換的能力,同時還要了解大家頭腦中的“共識”。
比如寫一部小說或者電影的觀后感就是一種總結(jié)和梳理,從文章的內(nèi)容和結(jié)構(gòu)上也能看到寫作者的思路和關(guān)注點。練習(xí)作文或者寫程序,不只是掌握語言本身,也是鍛煉總結(jié)、抽象的能力。這種能力必須通過不斷地書寫、修改、總結(jié)來增強。
雖然很多思維與語言無關(guān),比如觸覺、味覺、情緒,不一定能用語言精確地表達出來,但我們?nèi)匀怀S谜Z言來思考問題,比如常常聽到小孩自言自語,成人思考問題,有時也像在腦中獨白或者與人對話,這都是語言賦予我們的思考方式。
16.5.3 語言以外的表達方式
語言是一種鏈?zhǔn)降谋磉_方式,除了簡單,它還有利于推導(dǎo),歸因……但是,腦中的結(jié)構(gòu)往往更加復(fù)雜,比如下圖中的關(guān)系,雖然可以用語言描述,但是非常麻煩。除了各個部件之間的關(guān)系,描述時還需要考慮如何遣詞造句,這就把問題變得更加復(fù)雜。
圖16.9 關(guān)系圖
流程圖,思維導(dǎo)圖,公式,程序,它們不僅與自然語言的語法不同,結(jié)構(gòu)也不同。在不同情況下,可采用不同的表達方式,如果做數(shù)學(xué)應(yīng)用題的時候也用畫圖的方法,換一種角度表達,可能描述本身就是問題的答案。
16.5.4 學(xué)習(xí)語言
霍金曾說:多寫一個公式就會嚇跑一半讀者,英國一項研究證明:數(shù)學(xué)公式不但會嚇跑普通讀者,科學(xué)家也會被公式嚇跑。這主要由于日常生活中并不經(jīng)常使用公式。學(xué)習(xí)語言需要大量時間。自然語言是這樣,公式和程序語言也一樣,需要反復(fù)學(xué)習(xí)和使用才能記憶。
腦中沒有大量的存儲空間用于記憶,即使空間足夠,從海量信息之中查找也需要大量時間。因此,只有反復(fù)使用的內(nèi)容才能被記住。也只有掌握了語言,才可能利用它思考和解決問題。學(xué)任何一門非母語的語言都有很大難度,甚至大多數(shù)人對母語掌握得也沒有想象中那么好,比如很少有人能駕馭小說、新聞等不同風(fēng)格的文章寫作。
寫作的人將腦中的思維框架轉(zhuǎn)換成文字,并試圖在讀者腦中構(gòu)建起類似的結(jié)構(gòu),其中包括著大量的常識和背景知識,比如通過故事發(fā)生的時間、地點、氛圍、故事風(fēng)格,激活讀者腦中的某種場景,這些都是文字之外的信息。思維中故事的框架是多層次的網(wǎng)絡(luò),而機器所識別的文字只是相對扁平的結(jié)構(gòu)。
通過前幾講的學(xué)習(xí)可以看到,目前機器學(xué)習(xí)模仿寫武俠小說的能力已經(jīng)非常強大,而小說的風(fēng)格明顯不適合寫新聞。如果想訓(xùn)練機器寫所有類型文章,則需要使用非常大量的數(shù)據(jù)訓(xùn)練模型,讓它擁有基本寫作能力。然后再根據(jù)要生成的不同文章類型,定向訓(xùn)練。機器有海量的存儲和算力,但不是每個人都有時間和條件作大規(guī)模的訓(xùn)練。
學(xué)習(xí)自然語言也一樣,如果希望讀懂新聞,對話,科技論文,就需要非常大量的訓(xùn)練,不如想看論文,就主要讀論文,當(dāng)然,練習(xí)“閱讀論文”對“對話水平”提高有限。
16.6 小結(jié)
16.6.1單詞
本講需要掌握的英文單詞如表16.3所示。
表16.3本講需要掌握的英文單詞
16.6.2習(xí)題答案
1.練習(xí)一:繪制如圖16.8所示的計算器界面,其中上方用Label顯示輸入數(shù)值和計算結(jié)果,下方提供12個按鈕用于輸入數(shù)字和符號。
2.練習(xí)二:繼續(xù)完成上題中計算器程序,響應(yīng)用戶按下各個按鈕的事件,更新Label顯示算式,在用戶按下”=”按鈕時,計算算式結(jié)果。
01 import tkinter
02
03 win=tkinter.Tk()
04
05 f1=tkinter.Frame(win)
06 f1.pack()
07 f2=tkinter.Frame(win)
08 f2.pack()
09
10 label=tkinter.Label(f1,text="")
11 label.grid(row=0,column=0)
12 def do_1():
13 y=label['text']
14 x=str(1)
15 s=y+x
16 label.configure(text=s)
17
18 bt1=tkinter.Button(f2,text='1',command=do_1)
19 bt1.grid(row=1,column=0)
20 def do_2():
21 y=label['text']
22 x=str(2)
23 s=y+x
24 label.configure(text=s)
25
26 bt1=tkinter.Button(f2,text='2',command=do_2)
27 bt1.grid(row=1,column=1)
28 def do_3():
29 y=label['text']
30 x=str(3)
31 s=y+x
32 label.configure(text=s)
… # 此處省略其它數(shù)字
90 btjia=tkinter.Button(f2,text='+',command=do_jiahao)
92 btjia.grid(row=4,column=1)
93 def do_dengyu():
94 y=label['text']
95 t=str(eval(y))
96 label.configure(text=t)
97
98 btd=tkinter.Button(f2,text='=',command=do_dengyu)
99 btd.grid(row=4,column=2)
100 def do_jianhao():
101 y=label['text']
102 x=str('-')
103 s=y+x
104 label.configure(text=s)
… # 此處省略乘除運算
132 win.mainloop()
3.練習(xí)三:總結(jié)常見錯誤信息及其原因。
總結(jié)
以上是生活随笔為你收集整理的python少儿图形编程_少儿Python编程_第十六讲:图形界面开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 懒人的法宝——办公自动化!
- 下一篇: pythonalist是什么意思_3.