日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python少儿图形编程_少儿Python编程_第十六讲:图形界面开发

發(fā)布時間:2023/12/16 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python少儿图形编程_少儿Python编程_第十六讲:图形界面开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

運行在計算機上的程序一般分為命令行程序和圖形界面程序,例如:安裝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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。