




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python程序設(shè)計(jì)方法第7章文件與異常第6章文件和異常6.1文件6.2異常第7章文件和異常7.1文件6.1文件1.文件類型2.數(shù)據(jù)訪問(wèn)方式文本文件:文本編碼的數(shù)據(jù),如ASCII或Unicode編碼等,可以使用文本編輯器打開(kāi)、查看;二進(jìn)制文件:存儲(chǔ)的數(shù)據(jù)僅適用于程序讀取,無(wú)法使用文本編輯器查看;順序存取文件:必須要按照從前到后的順序訪問(wèn)文件中的數(shù)據(jù),即如果想讀取存儲(chǔ)在文件末尾的數(shù)據(jù),那么必須先讀取在它之前的所有數(shù)據(jù);直接存取文件:也稱作隨機(jī)訪問(wèn)文件,是指可以直接跳轉(zhuǎn)到文件中的任何數(shù)據(jù),而無(wú)須讀取它之前的數(shù)據(jù);6.1.1文件對(duì)象1.文件擴(kuò)展名2.文件對(duì)象文件的命名通常是由計(jì)算機(jī)操作系統(tǒng)的文件命名規(guī)則所決定的,大多數(shù)系統(tǒng)支持使用文件擴(kuò)展名的方式命名;出現(xiàn)在一個(gè)文件名之后的有一個(gè)句點(diǎn)(被稱為“點(diǎn)”)的短字符序列,通常表示存儲(chǔ)在文件中的數(shù)據(jù)類型,如.jpg、.txt、.doc;文件對(duì)象是與特定文件相關(guān)聯(lián)的一個(gè)對(duì)象在程序中使用一個(gè)變量引用文件對(duì)象,那么該變量就可用于執(zhí)行在文件上的任何操作6.1.1文件對(duì)象2.文件對(duì)象(續(xù))圖6-1變量名引用與文件相關(guān)聯(lián)的一個(gè)文件對(duì)象6.1.2文件讀寫操作1.輸出文件描述數(shù)據(jù)寫入的一個(gè)文件,程序?qū)⑤敵鰯?shù)據(jù)到該文件;將數(shù)據(jù)保存到文件中的過(guò)程稱為“寫入數(shù)據(jù)”到文件,當(dāng)數(shù)據(jù)寫入到一個(gè)文件中即它從內(nèi)存中的變量復(fù)制到文件圖6-2向文件寫入數(shù)據(jù)6.1.2文件讀寫操作2.輸入文件描述數(shù)據(jù)讀取的一個(gè)文件,程序?qū)奈募械玫捷斎耄晃募凶x取數(shù)據(jù)的過(guò)程稱為從文件中“讀取數(shù)據(jù)”,當(dāng)數(shù)據(jù)從一個(gè)文件中讀取即它從文件中復(fù)制到內(nèi)存中并由一個(gè)變量引用圖6-3向文件讀取數(shù)據(jù)6.1.2文件讀寫操作3文件操作一般步驟第一步:打開(kāi)文件
創(chuàng)建一個(gè)文件和程序之間的連接,即文件對(duì)象。打開(kāi)輸出文件通常會(huì)在磁盤上創(chuàng)建文件,并允許程序向其寫入數(shù)據(jù)。打開(kāi)輸入文件允許程序從文件中讀取數(shù)據(jù);第二步:處理文件
將數(shù)據(jù)寫入文件(如果是輸出文件)或從文件中讀?。ㄈ绻禽斎胛募坏谌剑宏P(guān)閉文件
程序使用文件完成后,該文件必須關(guān)閉。關(guān)閉文件會(huì)斷開(kāi)文件與程序的連接。6.1.2文件讀寫操作4使用Python打開(kāi)文件
使用open函數(shù)打開(kāi)文件:創(chuàng)建一個(gè)文件對(duì)象將其與磁盤上的文件相關(guān)聯(lián)。使用open函數(shù)的一般格式為:file_variable=open(filename,mode)
其中:
file_variable表示引用該文件對(duì)象的變量名;
filename指定文件名稱的一個(gè)字符串;
mode指定文件以何種模式(讀、寫等)打開(kāi)的一個(gè)字符串6.1.2文件讀寫操作4使用Python打開(kāi)文件(續(xù))
表6-1Python中打開(kāi)文件的模式模式描述'r'以只讀方式打開(kāi)文件。文件不能修改或者寫入'w'以寫入方式打開(kāi)文件。如果文件已經(jīng)存在,則清除其內(nèi)容;如果文件不存在,則創(chuàng)建它'a'以追加方式打開(kāi)文件。所有寫入文件的數(shù)據(jù)將追加到文件末尾。如果文件不存在,則創(chuàng)建它6.1.2文件讀寫操作5使用Python處理文件——將數(shù)據(jù)寫入文件
使用文件對(duì)象的write方法將數(shù)據(jù)寫入一個(gè)文件,調(diào)用write方法的一般格式為:file_variable.write(string)
其中:
file_variable是引用一個(gè)文件對(duì)象的變量string表示一個(gè)即將寫入文件的字符串*前提是該文件必須以寫的模式(用'
w'或者'
a'模式)打開(kāi),否則會(huì)發(fā)生錯(cuò)誤;6.1.2文件讀寫操作5使用Python處理文件——從文件讀取數(shù)據(jù)
使用文件對(duì)象的read方法,會(huì)將文件中的內(nèi)容以字符串的形式返回,一般格式為:file_contents=file_variable.read()
其中:
變量file_contents表示以字符串形式返回文件中讀取的內(nèi)容
*前提是該文件已經(jīng)被打開(kāi)準(zhǔn)備讀取(用'
r'模式)Python中提供的readline方法可以實(shí)現(xiàn)從文件中每次僅讀取一行(以\n字符結(jié)尾的字符串)。該方法以字符串的形式返回一行,調(diào)用格式與read方法類似。6.1.2文件讀寫操作5使用Python處理文件——關(guān)閉文件
一旦程序處理完文件后,應(yīng)斷開(kāi)程序與文件的連接,即關(guān)閉文件;
關(guān)閉輸出文件的過(guò)程就是強(qiáng)制將在緩沖區(qū)中剩余的任何未保存的數(shù)據(jù)寫入文件使用文件對(duì)象的close方法關(guān)閉文件,一般格式為:file_variable.close()
6.1.2文件讀寫操作6文件內(nèi)容追加——使用'
a'模式打開(kāi)輸出文件
當(dāng)使用'
w'模式打開(kāi)輸出文件并且該文件名指定的文件已經(jīng)存在于磁盤上,已有的文件將被刪除,并且創(chuàng)建一個(gè)具有相同名稱的新的空文件;如果想保留一個(gè)現(xiàn)有的文件并追加新數(shù)據(jù)到該文件中,可以使用'
a'模式以追加模式打開(kāi)輸出文件:
如果文件已經(jīng)存在,它不會(huì)被刪除。如果文件不存在,那么它將會(huì)被創(chuàng)建出來(lái);當(dāng)數(shù)據(jù)寫入文件中時(shí),它會(huì)寫在該文件當(dāng)前內(nèi)容的末尾;
6.1.2文件讀寫操作7with語(yǔ)句簡(jiǎn)化文件操作
with語(yǔ)句執(zhí)行文件打開(kāi)操作,實(shí)現(xiàn)預(yù)定義清理操作,文件在使用后將自動(dòng)關(guān)閉而不再需要關(guān)閉文件的步驟。with語(yǔ)句的基本格式:
withexpression[asobject]:
<對(duì)象操作語(yǔ)句>
例如新建一個(gè)文本文件one_city.txt,在文件中輸入文本Hangzhou,在同一目錄下編寫如下代碼:
defmain():
withopen('one_city.txt','r')asinfile:print(infile.readline())main()6.1.2文件讀寫操作8使用循環(huán)處理文件——
while循環(huán)readline方法在讀取文件末尾之外的內(nèi)容時(shí)會(huì)返回空字符串('
'),可以使用while循環(huán)來(lái)確定何時(shí)到達(dá)文件的末尾。算法的偽代碼如下:OpenthefileUsereadlinetoreadthefirstlinefromthefileWhilethevaluereturnedfromreadlineisnotanemptystring:ProcesstheitemthatwasjustreadfromthefileUsereadlinetoreadthenextlinefromthefileClosethefile6.1.2文件讀寫操作8使用循環(huán)處理文件——
while循環(huán)(續(xù))偽代碼在進(jìn)入while循環(huán)之前先調(diào)用了readline函數(shù),該函數(shù)可以得到文件的第一行內(nèi)容,可以進(jìn)行循環(huán)測(cè)試,算法流程圖如下所示:圖6-4檢測(cè)讀取位置是否到達(dá)文件末尾的流程圖6.1.2文件讀寫操作8使用循環(huán)處理文件——
for循環(huán)Python語(yǔ)言中還提供了一個(gè)for循環(huán),可以自動(dòng)讀取文件中的每一行而無(wú)須檢測(cè)文件末尾的任何特殊條件。for循環(huán)不需要啟動(dòng)讀取操作,并且在到達(dá)文件末尾時(shí)它會(huì)自動(dòng)停止。一般格式為:
forvariableinfile_object:<語(yǔ)句><語(yǔ)句>
其中:variable是變量的名稱,file_object是引用文件對(duì)象的變量;該循環(huán)將在文件中的每一行上迭代一次:第1次循環(huán)迭代時(shí),variable將引用文件中的第1行(作為字符串),第2次循環(huán)迭代時(shí),variable將引用第2行,以此類推;第6章文件和異常6.2異常6.2.1異常1異常在程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤,一般會(huì)導(dǎo)致程序突然停止traceback:程序運(yùn)行中產(chǎn)生的錯(cuò)誤信息,涉及到導(dǎo)致異常的行號(hào)(一個(gè)或多個(gè))信息
錯(cuò)誤的最后一行信息會(huì)顯示所引發(fā)的異常名稱和引發(fā)該異常的錯(cuò)誤的簡(jiǎn)要說(shuō)明(如整數(shù)除零或模零),如下所示:6.2.1異常1異常(續(xù))許多異??梢酝ㄟ^(guò)仔細(xì)編寫程序來(lái)避免,例如:輸入驗(yàn)證
ifnum2!=0:result=num1/num2print('num1/num2',result)else:print('Cannotdividebyzero')但有些異常是不能通過(guò)仔細(xì)編碼來(lái)避免的,例如:
程序要將非數(shù)字字符串轉(zhuǎn)換為整數(shù);
程序要打開(kāi)以讀取不存在的文件;6.2.1異常1異常(續(xù))異常是一個(gè)Python對(duì)象,表示一個(gè)錯(cuò)誤,當(dāng)Python腳本發(fā)生異常時(shí),需要捕獲處理它,否則程序會(huì)終止執(zhí)行。異常是程序出現(xiàn)了錯(cuò)誤為排除錯(cuò)誤而在正??刂屏髦獠扇〉男袨椋▌?dòng)作)。這個(gè)行為動(dòng)作又分為兩個(gè)階段:
第一階段:檢測(cè)異常,Python解釋器將觸發(fā)一個(gè)異常信號(hào),程序也可以自己引發(fā)異常信號(hào)。只要有異常(信號(hào)),解釋器都要暫停當(dāng)前正在執(zhí)行的程序,而去處理因?yàn)殄e(cuò)誤引發(fā)的異常,即轉(zhuǎn)入第二階段的工作;
第二階段:處理異常,它包括忽略錯(cuò)誤或采取補(bǔ)救措施讓程序繼續(xù)執(zhí)行。無(wú)論是哪種方式都代表執(zhí)行的繼續(xù),也可以把這種工作看作是程序控制流的一個(gè)控制分支;
6.2.1異常2使用try-except語(yǔ)句捕獲異常使用try/except語(yǔ)句來(lái)捕獲異常,這樣的代碼稱為異常處理句柄。try/except語(yǔ)句的格式可以有多種,但最簡(jiǎn)單的一種形式為:
try:
<語(yǔ)句>
except異常名稱:
<語(yǔ)句>
其中:
關(guān)鍵字try及其后面的語(yǔ)句塊稱為try語(yǔ)句塊;之后一個(gè)except語(yǔ)句出現(xiàn),except語(yǔ)句以關(guān)鍵字except開(kāi)始,可選擇地跟一個(gè)異常的名字,并用冒號(hào)結(jié)束,下一行開(kāi)始的語(yǔ)句塊稱為“句柄”;6.2.1異常2使用try-except語(yǔ)句捕獲異常(續(xù))上述這種格式用來(lái)檢測(cè)try語(yǔ)句塊中的錯(cuò)誤,從而讓except語(yǔ)句捕獲異常信息并處理。當(dāng)try/except語(yǔ)句執(zhí)行時(shí),在try語(yǔ)句塊中的語(yǔ)句開(kāi)始執(zhí)行,之后:
如果try語(yǔ)句塊中的一個(gè)語(yǔ)句拋出了由except語(yǔ)句指定的名稱的異常,則該句柄立即執(zhí)行except語(yǔ)句。然后,程序會(huì)在try/except語(yǔ)句之后的一條語(yǔ)句處繼續(xù)執(zhí)行;
如果try語(yǔ)句塊中的一個(gè)語(yǔ)句拋出的異常不是except語(yǔ)句指定名稱的異常,然后程序會(huì)輸出traceback錯(cuò)誤消息并停止;
如果try語(yǔ)句塊中的語(yǔ)句執(zhí)行中沒(méi)有拋出異常,則任何except語(yǔ)句和句柄會(huì)被忽略,并且程序會(huì)在try/except語(yǔ)句之后的一條語(yǔ)句處繼續(xù)執(zhí)行;6.2.1異常3處理多個(gè)異常:使用except語(yǔ)句捕獲所有異常在許多情況下,try語(yǔ)句塊中的代碼可能會(huì)拋出多種類型的異常,需要為每個(gè)類型的異常編寫一個(gè)except語(yǔ)句來(lái)處理。如果異常的類型太多而無(wú)法或者不便一一列舉,可以使用except語(yǔ)句(不需要加異常名稱)來(lái)捕獲所有異常。這種形式如下所示:
try:
<語(yǔ)句>
except異常名稱1:
<語(yǔ)句>
except異常名稱2:
<語(yǔ)句>............
except:
<語(yǔ)句>6.2.1異常4顯示異常的默認(rèn)錯(cuò)誤信息當(dāng)拋出一個(gè)異常時(shí),一個(gè)稱為異常對(duì)象的對(duì)象將在
內(nèi)存中創(chuàng)建出來(lái)
異常對(duì)象通常包含該異常的默認(rèn)錯(cuò)誤消息,編寫except語(yǔ)句時(shí),能夠可選地為異常對(duì)象分配一個(gè)變量,如下所示:exceptValueErrorasvariable:
這個(gè)except子句捕獲了ValueError異常。出現(xiàn)在except語(yǔ)句之后的表達(dá)式表示將異常對(duì)象賦值給變量variable。然后可以在異常句柄中將變量傳遞給print函數(shù)來(lái)顯示Python為該類錯(cuò)誤提供的默認(rèn)錯(cuò)誤消息。6.2.1異常5else語(yǔ)句try/except語(yǔ)句中有一個(gè)可選的else語(yǔ)句,出現(xiàn)在所有的except語(yǔ)句之后,一般使用形式為:
try:
<語(yǔ)句>
except異常名稱:
<語(yǔ)句>
else:
<語(yǔ)句>
出現(xiàn)在else語(yǔ)句后的語(yǔ)句塊稱之為else語(yǔ)句塊。else語(yǔ)句塊中的語(yǔ)句在try語(yǔ)句塊之后并且只有在沒(méi)有引發(fā)異常時(shí)才會(huì)執(zhí)行。如果引發(fā)了異常,else語(yǔ)句塊將會(huì)跳過(guò);6.2.1異常6finally語(yǔ)句try/except語(yǔ)句有一個(gè)可選的finally語(yǔ)句,它必須出現(xiàn)在所有的except語(yǔ)句之后,一般使用形式為:
try:
<語(yǔ)句>
except異常名稱:
<語(yǔ)句>finally:
<語(yǔ)句>
出現(xiàn)在finally語(yǔ)句后的語(yǔ)句塊稱之為finally語(yǔ)句塊。finally語(yǔ)句塊中的語(yǔ)句總是在try語(yǔ)句塊和所有異常句柄執(zhí)行完后才執(zhí)行。無(wú)論是否有異常發(fā)生,finally語(yǔ)句塊中的語(yǔ)句總會(huì)執(zhí)行,比如關(guān)閉文件、釋放鎖等;6.2.1異常7with語(yǔ)句with語(yǔ)句是在python2.5后的版本中得到支持的。在之前的版本中,如果要正確處理程序中存在的異常,則需要使用try...finally代碼結(jié)構(gòu)。with語(yǔ)句可用于對(duì)資源進(jìn)行訪問(wèn),不管在使用過(guò)程中是否發(fā)生異常都會(huì)執(zhí)行必要的“清理”工作,釋放資源,因此with語(yǔ)句可用來(lái)簡(jiǎn)化這種寫法。這里明確with語(yǔ)句后的表達(dá)式為上下文表達(dá)式,如下所示:
with上下文表達(dá)式[asobject]:
<對(duì)象操作語(yǔ)句>
6.2.1異常7with語(yǔ)句(續(xù))例如,讀取文件內(nèi)容:
f=open('city.txt')try:forlineinf.readline():print(line)finally:f.close()
withopen('city.txt')asf:forlineinf.readline():print(line)
使用try/finally語(yǔ)句使用with語(yǔ)句6.2.1異常7with語(yǔ)句(續(xù))改寫后的代碼相對(duì)try/finally語(yǔ)句塊來(lái)說(shuō)簡(jiǎn)潔了很多,而且也不需要使用f.close()語(yǔ)句關(guān)閉文件。因?yàn)閣ith語(yǔ)句具有上下文管理器的功能。上下文管理器是一個(gè)實(shí)現(xiàn)了上下文協(xié)議的類,而所謂的上下文協(xié)議就是一個(gè)類要實(shí)現(xiàn)__enter__()和__exit__()兩個(gè)方法。
__enter__()方法主要執(zhí)行一些環(huán)境準(zhǔn)備工作,同時(shí)返回一個(gè)資源對(duì)象,例如上下文管理器open('city.txt')的__enter__()函數(shù)返回一個(gè)文件對(duì)象。__exit__()方法的完整形式為_(kāi)_exit__(type,value,traceback),其中三個(gè)參數(shù)分別為異常類型、異常信息和堆棧。如果執(zhí)行體語(yǔ)句沒(méi)有引發(fā)異常,則這三個(gè)參數(shù)均被設(shè)為None。否則,它們將包含上下文的異常信息。__exit__()方法返回True或False,分別表示被引發(fā)的異常是否被處理:如果返回False,引發(fā)的異常將會(huì)被傳遞出上下文。但如果__exit__()函數(shù)內(nèi)部引發(fā)了異常,則會(huì)覆蓋掉執(zhí)行體中引發(fā)的異常。處理異常時(shí),不需要重新拋出異常,只需要返回False,with語(yǔ)句會(huì)檢測(cè)__exit__()返回False來(lái)處理異常。
6.2.1異常7with語(yǔ)句(續(xù))with語(yǔ)句中的上下文表達(dá)式是一個(gè)上下文管理器,實(shí)現(xiàn)__enter__和__exit__兩個(gè)函數(shù)。當(dāng)調(diào)用with語(yǔ)句時(shí),執(zhí)行過(guò)程如下:
(1)首先生成一個(gè)上下文管理器expression,在上文的例子中with語(yǔ)句首先以'city.txt'作為參數(shù)生成一個(gè)上下文管理器open('city.txt')。
(2)然后執(zhí)行expression.__enter__()。如果指定了[asresource_object]說(shuō)明符,將__enter__()的返回值賦值給資源對(duì)象,在上文的例子中open('city.txt').__enter__()返回的是一個(gè)文件對(duì)象給f。
(3)執(zhí)行對(duì)象操作語(yǔ)句塊。上文的例子中執(zhí)行文件讀取操作。
(4)執(zhí)行expression.__exit__(),在__exit__()函數(shù)中可以進(jìn)行資源清理工作,上文例子中就是執(zhí)行文件的關(guān)閉操作。
主講教師:?jiǎn)?/p>
位:Python程序設(shè)計(jì)方法第8章數(shù)據(jù)分析和可視化第8章數(shù)據(jù)分析和可視化8.1使用matplotlib繪制圖表8.2繪制折線圖8.3直方圖8.4繪制條形圖 8.5繪制餅圖8.6繪制散點(diǎn)圖 8.7子圖第8章數(shù)據(jù)分析和可視化8.1使用matplotlib繪制圖表8.1使用matplotlib繪制圖表matplotlib(/)是一個(gè)Python2D繪圖庫(kù),它是最流行的用于制圖及其他二維數(shù)據(jù)可視化的Python庫(kù)。matplotlib庫(kù)中的
pyplot
模塊提供了類似于MATLAB的界面函數(shù)功能函數(shù)功能plt.plot(x,y,fmt,...)繪制一個(gè)坐標(biāo)圖plt.psd(x,NFFT=256,pad_to,Fs)繪制功率譜密度圖plt.boxplot(data,notch,position)繪制一個(gè)箱型圖plt.specgram(x,NFFT=256,pad_to,F)繪制譜圖plt.bar(left,height,width,bottom)繪制一個(gè)條形圖plt.cohere(x,y,NFFT=256,Fs)繪制X-Y的相關(guān)性函數(shù)plt.barh(width,bottom,left,height)繪制一個(gè)橫向條形圖plt.scatter(x,y)繪制散點(diǎn)圖,其中x和y長(zhǎng)度相同plt.polar(theta,r)繪制極坐標(biāo)圖plt.step(x,y,where)繪制步階圖plt.pie(data,explode)繪制餅圖plt.hist(x,bins,normed)繪制直方圖plot.contour(X,Y,Z,N)繪制等值圖plt.vlines()繪制垂直圖plt.stem(x,y,linefmt,markerfmt)繪制柴火圖plt.plot_date()繪制數(shù)據(jù)日期常用的pyplot函數(shù)8.1使用matplotlib繪制圖表1.安裝matplotlib并導(dǎo)入進(jìn)入命令提示符窗口,輸入:python-mpipinstall-Umatplotlib或者pipinstallmatplotlib啟動(dòng)IDLE并輸入:importmatplotlib如果沒(méi)有看到錯(cuò)誤信息,則說(shuō)明已經(jīng)安裝成功。使用pyplot模塊生成一幅簡(jiǎn)單的交互式圖表,首先要導(dǎo)入pyplot模塊,并將其命名為plt。importmatplotlib.pyplotasplt8.1使用matplotlib繪制圖表2.
Figure和Axes對(duì)象Figure對(duì)象是一個(gè)頂層的繪圖區(qū)域,對(duì)應(yīng)整個(gè)圖形表示,使用figure()函數(shù)可以創(chuàng)建一個(gè)Figure對(duì)象。在Figure中可以包含一個(gè)或多個(gè)Axes對(duì)象,而Axes對(duì)象通常表示圖形或圖表是對(duì)什么內(nèi)容進(jìn)行作圖的,是包含了大多數(shù)圖表元素如標(biāo)題、標(biāo)簽、文本和刻度等的坐標(biāo)系統(tǒng)。通??梢允÷赃@兩條語(yǔ)句,在繪制圖表時(shí)默認(rèn)為當(dāng)前的Figure對(duì)象和Axes對(duì)象。import
matplotlib.pyplot
as
pltfig
=
plt.figure()ax
=
plt.axes()8.1使用matplotlib繪制圖表importmatplotlib.pyplotasplt#默認(rèn)線條顏色為藍(lán)色plt.plot([1,2,3,4])plt.show()使用plt.plot()函數(shù)繪制圖表。圖形表示的是一對(duì)(x,y),其中第一個(gè)數(shù)組為x軸的各個(gè)值,第2個(gè)數(shù)組為y軸的值,還可以接收第3個(gè)參數(shù),描述數(shù)據(jù)點(diǎn)在圖表中的顯示方式。若傳入只有一個(gè)數(shù)組,則默認(rèn)為y值,將其余一個(gè)序列的x值對(duì)應(yīng)起來(lái),x的取值依次為0、1、2、3.....。8.1使用matplotlib繪制圖表可以通過(guò)設(shè)置屬性顯示圖表標(biāo)題、X軸標(biāo)簽、Y軸標(biāo)簽、圖例等,并可自定義X軸和Y軸的刻度或標(biāo)簽等。8.1使用matplotlib繪制圖表importnumpyasnpimportmatplotlib.pyplotaspltt=np.arange(0.0,2.0,0.01)s=np.sin(2*np.pi*t)#繪制曲線plt.plot(t,s)#添加圖表標(biāo)題plt.title(r'$\alpha_i>\beta_i$',fontsize=20)#添加文本plt.text(1,-0.6,r'$\sum_{i=0}^\inftyx_i$',fontsize=20,color='red')plt.text(0.6,0.6,r'$\mathcal{A}\mathrm{sin}(2\omegat)$',
fontsize=20,bbox={'facecolor':'yellow','alpha':0.5})#添加坐標(biāo)軸標(biāo)簽plt.xlabel('time(s)')plt.ylabel('volts(mV)')plt.show()文本內(nèi)容在兩個(gè)$符號(hào)之間的是LaTex表達(dá)式程序清單8-28.1使用matplotlib繪制圖表importmatplotlib.pyplotaspltfig=plt.figure()#顯示中文plt.rcParams['font.sans-serif']=['SimHei']#顯示標(biāo)題plt.title("周用電量")#顯示X軸和Y軸標(biāo)簽plt.xlabel("日期")plt.ylabel("用電量")#定義X軸和Y軸的刻度plt.xlim(xmin=0,xmax=7)plt.ylim(ymin=0,ymax=60)#定義X軸和Y軸的刻度線標(biāo)簽plt.xticks([0,1,2,3,4,5,6],["2021-04-03","2021-04-04","2021-04-05","2021-04-06","2021-04-07","2021-04-08","2021-04-09"],rotation=30)#對(duì)應(yīng)每日的電量數(shù)據(jù)e_data=[31.46,31.24,37.82,17.45,19.96,31.87,28.95]#繪制折線plt.plot(e_data,"bo-",label="日用電量")#顯示文本forxinrange(6):plt.text(x=x,y=e_data[x]+1,s=e_data[x])#顯示圖例plt.legend()#存儲(chǔ)圖像plt.savefig("f.png")plt.show()程序清單8-3第8章數(shù)據(jù)分析和可視化8.2繪制折線圖8.2繪制折線圖importmatplotlib.pyplotaspltx=[1,2,3,4,5]y=[1,4,7,2,5]plt.plot(x,y)plt.show()plot函數(shù)接收帶有x和y軸的列表。圖中每個(gè)點(diǎn)是坐標(biāo)(X,Y)。程序清單8-28.2繪制折線圖#帶有標(biāo)記的折線圖importmatplotlib.pyplotaspltfromnumpy.randomimportrandn#繪制隨機(jī)產(chǎn)生30個(gè)正態(tài)分布數(shù)據(jù)的折線圖plt.plot(randn(30).cumsum(),linestyle="--",color="k",marker='o')plt.show()參數(shù)linestyle表示線型,color表示顏色,market表示在折線圖上標(biāo)記數(shù)據(jù)點(diǎn)。程序清單8-2第8章數(shù)據(jù)分析和可視化8.3
直方圖8.3
直方圖直方圖(Histogram),又稱質(zhì)量分布圖,是一種統(tǒng)計(jì)報(bào)告圖,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。一般用橫軸表示數(shù)據(jù)類型,縱軸表示分布情況。使用如下函數(shù)繪制直方圖hist(x,bins=None,range=None,density=False,weights=None,cumulative=False,bottom=None,histtype='bar',align='mid',orientation='vertical',rwidth=None,log=False,color=None,label=None,stacked=False,*,data=None,**kwargs)x為一個(gè)序列或數(shù)組,計(jì)算并繪制x的直方圖,返回的值是一個(gè)元組(n,bins,patches)?!境绦?-8】importmatplotlib.pyplotaspltimportnumpyasnpplt.rcParams['font.sans-serif']=['SimHei']
#顯示中文plt.title("某次競(jìng)賽成績(jī)分布圖")grade=[100,97,96,94,94,93,90,90,89,88,85,85,84,83,83,82,81,80,80,80,76,76,76]#設(shè)置條形之間的間隔bins=20#繪制直方圖plt.hist(grade,bins)plt.show()某個(gè)班級(jí)有23人,某次競(jìng)賽成績(jī)?yōu)椋篻rade=[100,97,96,94,94,93,90,90,89,88,85,85,84,83,83,82,81,80,80,80,76,76,76],繪制成績(jī)分布直方圖第8章數(shù)據(jù)分析和可視化8.4
繪制條形圖8.4
繪制條形圖使用matplotlib.pyplot模塊中的bar函數(shù)來(lái)創(chuàng)建一個(gè)條形圖bar(x,
height,
width=0.8,
bottom=None,
*,
align='center',
data=None,
**kwargs)x軸表示的不是數(shù)值而是類別。常用的關(guān)鍵字參數(shù):coloredgecolorlinewidth等【程序8-9】importmatplotlib.pyplotasplt#顯示中文plt.rcParams['font.sans-serif']=['SimHei']#X坐標(biāo)值left_edges=[0,10,20,30,40]
#Y坐標(biāo)值heights=[100,200,300,400,500]
#條形寬度bar_width=5#根據(jù)color中的值繪制不同顏色的條形圖plt.bar(left_edges,heights,bar_width,color=('r','g','b','c','k'))plt.show()繪制一個(gè)寬度為5,每個(gè)條形有不同顏色的條形圖。第8章數(shù)據(jù)分析和可視化8.5繪制餅圖8.5繪制餅圖使用matplotlib.pyplot模塊的pie函數(shù)創(chuàng)建一個(gè)餅圖plt.pie(x,labels,colors,autopct,labeldistance,pctdistance,shadow,startangle,radius,explode,counterclock,center,frame)8.5繪制餅圖importmatplotlib.pyplotasplt#分片數(shù)據(jù)值values=[10,30,40,20]#繪制餅圖plt.pie(values)plt.show()調(diào)用pie函數(shù)時(shí),可傳遞一個(gè)列表作為參數(shù),列表中所有值的累加是整個(gè)餅圖的值,列表中的每個(gè)元素在餅圖中被分片,分片的大小表示該元素在整個(gè)餅圖中占的百分比,每個(gè)分片按一定順序自動(dòng)改變顏色?!境绦?-11】顯示各手機(jī)品牌的銷售量importmatplotlib.pyplotasplt#顯示中文plt.rcParams['font.sans-serif']=['SimHei']#餅圖各分片標(biāo)簽labels=['huawei','xiaomi','Samsun','Apple']#分片數(shù)據(jù)值values=[45,30,10,15]#各分片顏色colors=['red','yellow','green','blue']plt.title("手機(jī)銷售量",fontsize=20)#關(guān)鍵字參數(shù)labels設(shè)置每一小塊的標(biāo)簽,colors設(shè)置每一小塊的顏色,#autopic顯示每個(gè)分片百分比plt.pie(values,labels=labels,colors=colors,autopct="%d%%")#'equal'繪制標(biāo)準(zhǔn)的圓形餅圖plt.axis('equal')plt.show()pie函數(shù)中的labels參數(shù),可以用來(lái)顯示餅圖中每個(gè)分片的標(biāo)簽,由所希望顯示的標(biāo)簽組成的列表傳遞給函數(shù);colors參數(shù)可以指定顏色的不同值,由顏色代碼組成的元組為參數(shù)傳遞給函數(shù);autopic顯示每個(gè)分片百分比?!境绦?-12】顯示各手機(jī)品牌的銷售量,將其中三星手機(jī)的分片抽離importmatplotlib.pyplotasplt#顯示中文plt.rcParams['font.sans-serif']=['SimHei']labels=['華為','小米','三星','蘋果']values=[45,30,10,15]colors=['red','yellow','green','blue']plt.title("手機(jī)銷售量",fontsize=20)#設(shè)置抽離圓餅explode=[0,0,0.3,0]#關(guān)鍵字參數(shù)labels設(shè)置每一小塊的標(biāo)簽,colors設(shè)置每一小塊的顏色plt.pie(values,labels=labels,colors=colors,explode=explode,shadow=True,autopct='%1.1f%%',startangle=100)#'equal'繪制標(biāo)準(zhǔn)的圓形餅圖plt.axis('equal')plt.show()可以使用explode參數(shù)設(shè)置每個(gè)分片抽離餅圖的距離,傳遞一個(gè)列表給該參數(shù),列表的值表示每個(gè)分片抽離的距離【程序8-13】繪制一個(gè)消費(fèi)額的餅圖,其中將生活日用和購(gòu)物進(jìn)行抽離#繪制餅圖importmatplotlib.pyplotasplt#顯示中文plt.rcParams['font.sans-serif']=['SimHei']#解決坐標(biāo)值為負(fù)數(shù)時(shí)無(wú)法正常顯示負(fù)號(hào)的問(wèn)題plt.rcParams['axes.unicode_minus']=Falseslice_labels=["醫(yī)療保健","酒店旅行","交通","人情社交",\"餐飲","生活服務(wù)","購(gòu)物","轉(zhuǎn)賬","生活日用"]values=[1768,1360,1224.50,625.30,563.51,446.18,388.00,148.00,95]color=['b','c','g','y','m','r','c','b','g']#explode參數(shù)設(shè)置每個(gè)分片抽離餅圖的距離plt.pie(values,labels=slice_labels,labeldistance=1.1,autopct='%d%%',pctdistance=0.8,startangle=90,radius=1.0,explode=[0,0,0,0,0,0,0.3,0,0.3],colors=color)plt.show()【程序8-14】繪制一個(gè)消費(fèi)額的圓環(huán)圖。#繪制圓環(huán)圖importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']
#顯示中文#解決坐標(biāo)值為負(fù)數(shù)時(shí)無(wú)法正常顯示負(fù)號(hào)的問(wèn)題plt.rcParams['axes.unicode_minus']=Falseslice_labels=["醫(yī)療保健","酒店旅行","交通","人情社交",\"餐飲","生活服務(wù)","購(gòu)物","轉(zhuǎn)賬","生活日用"]values=[1768,1360,1224.50,625.30,563.51,446.18,388.00,148.00,95]color=['b','c','g','y','m','r','c','b','g']#設(shè)置wedgeprops參數(shù)制作圓環(huán)圖wedgeprops={'width':0.3,'linewidth':2,'edgecolor':'white'}plt.pie(values,labels=slice_labels,labeldistance=1.1,autopct='%d%%',wedgeprops=wedgeprops)#'equal'繪制標(biāo)準(zhǔn)的圓形餅圖plt.axis('equal')plt.show()為pie函數(shù)設(shè)置適當(dāng)?shù)膮?shù)wedgeprops的值,可以制作出圓環(huán)圖第8章數(shù)據(jù)分析和可視化8.6繪制散點(diǎn)圖8.6繪制散點(diǎn)圖使用matplotlib.pyplot模塊的scatter函數(shù)可繪制散點(diǎn)圖,參數(shù)marker用于設(shè)置散點(diǎn)圖中每個(gè)點(diǎn)的形狀。scatter(x,y,s,color,marker,linewidth,edgecolor)【程序8-15】隨機(jī)產(chǎn)生的500個(gè)0-1之間的數(shù)據(jù)點(diǎn)分布圖importmatplotlib.pyplotaspltimportrandom#顯示中文plt.rcParams['font.sans-serif']=['SimHei']#隨機(jī)產(chǎn)生500個(gè)0-1之間的數(shù)據(jù)點(diǎn)x=[]y=[]foriinrange(1,500):x.append(random.random())y.append(random.random())#繪制散點(diǎn)圖plt.scatter(x,y,marker='o')plt.show()第8章數(shù)據(jù)分析和可視化8.7子圖8.7子圖importmatplotlib.pyplotasplt#創(chuàng)建一個(gè)繪圖區(qū)域fig=plt.figure()#生成4個(gè)子圖ax1=fig.add_subplot(2,2,1)ax2=fig.add_subplot(2,2,2)ax3=fig.add_subplot(2,2,3)ax4=fig.add_subplot(2,2,4)x=[1,2,3,4]y=[1,2,3,4]#分別在每個(gè)子圖中繪制圖形ax1.plot(x,y)ax2.bar(x,y)ax3.pie(y)ax4.barh(x,y)plt.show()matplotlib所繪制的圖位于圖片對(duì)象中,可以使用plt.figure生成一個(gè)新的圖片??梢詫⒁环鶊D分成多幅子圖,使用add_subplot()創(chuàng)建一個(gè)或多個(gè)子圖(subplot)。然后再在每個(gè)子圖中繪制所需要的圖形。8.7.1多個(gè)繪圖區(qū)域importmatplotlib.pyplotaspltimportnumpyasnpt=np.arange(0.0,2.0,0.01)s1=np.sin(2*np.pi*t)s2=np.sin(4*np.pi*t)#在第一個(gè)figure中繪制圖形fig=plt.figure(1)plt.plot(t,s1)#在第二個(gè)figure中繪制圖形fig=plt.figure(2)plt.plot(t,s2)#重繪第一個(gè)圖形plt.figure(1)plt.plot(t,s2,'s')plt.show()matplotlib還可以同時(shí)管理多個(gè)圖形,一個(gè)figure是一個(gè)圖形,可以通過(guò)向figure()函數(shù)傳遞一個(gè)整數(shù)表示激活某一個(gè)figure。8.7.1多個(gè)繪圖區(qū)域importmathimportnumpyasnpimportmatplotlib.pyplotasplt#產(chǎn)生一系列點(diǎn)tt=np.arange(0,2.5,0.1)#對(duì)x軸的一系列數(shù)據(jù)點(diǎn)t應(yīng)用sin()函數(shù)產(chǎn)生對(duì)應(yīng)的y值y1=np.sin(math.pi*t)y2=np.sin(math.pi*t+math.pi/2)y3=np.sin(math.pi*t-math.pi/2)#分成3個(gè)子圖plt.subplot(311)plt.plot(t,y1,'b*')plt.subplot(312)plt.plot(t,y2,'g^')plt.subplot(313)plt.plot(t,y3,'ys')plt.show()在每個(gè)圖形中可以繪制幾個(gè)不同的子圖。subplot()函數(shù)可以將圖形分為不同的繪圖區(qū)域,用參數(shù)設(shè)置分區(qū)模式和當(dāng)前子圖,并能激活特定子圖,以便命令控制它。subplot()函數(shù)的參數(shù)由3個(gè)整數(shù)組成:第1個(gè)數(shù)字決定圖形沿垂直方向被分為幾部分,第2個(gè)數(shù)字決定圖形沿水平方向被分為幾部分,第3個(gè)數(shù)字設(shè)定可以直接用命令控制的子圖。其中傳遞給subplot()函數(shù)的參數(shù)311的第一個(gè)整數(shù)3指在垂直方向分成3個(gè)子圖,第2個(gè)1指在水平方向只有1個(gè)圖形,第3個(gè)1表示激活第1個(gè)子圖,然后使用plot()函數(shù)進(jìn)行繪制。8.7.2在其他子圖中顯示子圖importmatplotlib.pyplotaspltimportnumpyasnp#獲取一個(gè)Figure對(duì)象fig=plt.figure()#定義一個(gè)Axes對(duì)象ax#傳遞的參數(shù)是[left,bottom,width,height],表示figure的百分比ax=fig.add_axes([0.1,0.1,0.8,0.8])#定義第二個(gè)Axes對(duì)象inner_ax,嵌套在ax中inner_ax=fig.add_axes([0.6,0.6,0.25,0.25])#定義第一個(gè)圖的數(shù)據(jù)x1=np.arange(10)y1=np.array([1,2,7,1,5,2,4,2,3,1])#定義第二個(gè)圖的數(shù)據(jù)x2=np.arange(10)y2=np.array([1,3,4,5,4,5,2,6,4,3])#在ax中繪制圖形ax.plot(x1,y1)#在inner_ax中繪制圖形inner_ax.plot(x2,y2)plt.show()在一個(gè)圖形中放置多個(gè)圖表,可以使用figure()函數(shù)獲取一個(gè)Figure對(duì)象,然后用add_axes()函數(shù)在它上面定義兩個(gè)Axes對(duì)象。8.7.3子圖網(wǎng)格若需將圖形分成多個(gè)區(qū)域,添加多個(gè)子圖,使用subplots()函數(shù)可以生成多個(gè)子圖。subplots(nrows=1,
ncols=1,
*,
sharex=False,
sharey=False,
squeeze=True,
subplot_kw=None,
gridspec_kw=None,
**fig_kw)其中參數(shù)nrows表示生成子圖的行數(shù),ncols表示生成的子圖列數(shù)。默認(rèn)為1。importmatplotlib.pyplotasplt#使用axs表示多個(gè)Axes對(duì)象,如下產(chǎn)生4個(gè)子圖fig,axs=plt.subplots(2,2)plt.show()【程序8-17】使用subplots()函數(shù)在一行內(nèi)生成三個(gè)子圖,分別繪制條形圖、散點(diǎn)圖和折線圖。importmatplotlib.pyplotasplt#顯示中文plt.rcParams['font.sans-serif']=['SimHei']#定義數(shù)據(jù)data={'教授':5,'副教授':15,'講師':20,'助教':10}names=list(data.keys())values=list(data.values())#創(chuàng)建一行三個(gè)子圖fig,axs=plt.subplots(1,3,figsize=(9,3),sharey=True)#第一個(gè)子圖繪制條形圖axs[0].bar(names,values)#第二個(gè)子圖繪制散點(diǎn)圖axs[1].scatter(names,values)#第三個(gè)子圖繪制折線圖axs[2].plot(names,values)fig.suptitle('多類型圖形繪制')plt.show()Python程序設(shè)計(jì)Tkinter實(shí)現(xiàn)GUI主講教師:?jiǎn)?/p>
位:第9章Tkinter實(shí)現(xiàn)GUI編程
9.1Tkinter模塊和GUI 9.2Tkinter的常用控件 9.3Canvas組件 9.4TkinterGUI的應(yīng)用 9.4小結(jié) 9.1Tkinter模塊和GUI第9章Tkinter實(shí)現(xiàn)GUI編程 9.1Tkinter模塊和GUI
Tkinter模塊包含創(chuàng)建各種GUI的類。Tk類創(chuàng)建一個(gè)放置GUI小構(gòu)件的窗口。importtkinter導(dǎo)入tkinter模塊fromtkinterimport*導(dǎo)入Tkinter模塊中的所有類、函數(shù)和常量使用Tk類創(chuàng)建一個(gè)窗口mainloop()方法創(chuàng)建了一個(gè)事件循環(huán)Label、Button等都是小構(gòu)件,可以放置在窗口中pack()方法用來(lái)放置小構(gòu)件9.1Tkinter創(chuàng)建一個(gè)窗口fromtkinterimport*classMyGUI():def__init__(self):window=Tk()label=Label(text="WelcometoPython!")button=Button(text="Clickme")label.pack()button.pack()window.mainloop()defmain():myGUI=MyGUI()main()9.2.1Label控件9.2.2Button控件9.2.3Frame控件9.2.4Entry控件9.2.5RadioButton和CheckButton控件 9.2Tkinter的常用控件小構(gòu)件類小構(gòu)建類描述Button一個(gè)用來(lái)執(zhí)行一條命令的簡(jiǎn)單按鈕Canvas結(jié)構(gòu)化的圖形,用于繪制圖形、創(chuàng)建圖形編輯器以及實(shí)現(xiàn)自定制的小構(gòu)件類Checkbutton單擊復(fù)選按鈕在值之間切換Entry一個(gè)文本輸入域,也被稱為文本域或文本框Frame包含其他小構(gòu)件的一個(gè)容器小構(gòu)件Label顯示文本或圖像Menu用來(lái)實(shí)現(xiàn)下拉和彈出菜單的菜單欄Menubutton用來(lái)實(shí)現(xiàn)下拉菜單的菜單按鈕Message顯示文本,類似于標(biāo)簽小構(gòu)件,但能自動(dòng)將文本放在給定的寬度或?qū)捀弑葍?nèi)Radiobutton單擊單選按鈕設(shè)置變量為那個(gè)值,同時(shí)清除所有和同一個(gè)變量相關(guān)聯(lián)的其他單選按鈕Text格式化的文本顯示,允許用不同的風(fēng)格和屬性顯示和編輯文本,也支持內(nèi)嵌的圖片和窗口guiDemo1.py小構(gòu)件屬性小構(gòu)件有許多選項(xiàng)。第一個(gè)參數(shù)總是父容器。構(gòu)建一個(gè)小構(gòu)件時(shí),可以在構(gòu)造方法中指定它的屬性,如fg、bg、font、cursor、justify、text、和command。顏色用#RRGGBB方式指定常用小構(gòu)件屬性選項(xiàng)說(shuō)明text要顯示的文本image要顯示的圖像width組件的寬度,單位為像素或字符數(shù)height組件的高度,單位為像素或字符數(shù)relief邊框樣式。FLAT、GROOVE、RAISED、RIDGE和SUNKENborderwidth邊框?qū)挾萣ackground背景顏色名稱(字符串)foreground前景顏色名稱(字符串)Font字體描述符(作為元組,包括字體名稱,字體大小,以及可選字體樣式)padx,pady在x軸或y軸上添加到組件上的填充Label使用Label顯示文本使用Label顯示圖像可動(dòng)態(tài)顯示Label的內(nèi)容:一個(gè)StringVar對(duì)象可以與一個(gè)Label關(guān)聯(lián)使用Label控件中的textvariable參數(shù)與StringVar對(duì)象關(guān)聯(lián)關(guān)聯(lián)后存儲(chǔ)在StringVar中的值將自動(dòng)顯示在Label控件中showDeck.pyshowLabel.pyEntry使用Entry輸入單行文本e.get():返回輸入框e中的字符串e.insert(index,text):把text插入到輸入框e的給定索引位置index。如果index是END,則添加字符串到后面。e.delete(from,to):刪除輸入框e的從索引from到索引to的子字符串。delete(0,END)刪除輸入框中的所有文本。testGUI.pyButton按鈕,點(diǎn)擊產(chǎn)生一個(gè)事件command參數(shù)填寫處理函數(shù)的名稱Radio按鈕單選按鈕Radiobutton與一個(gè)名為IntVar的類一起使用一組Radiobutton與同一個(gè)IntVar對(duì)象相關(guān)聯(lián)參數(shù)variable與IntVar對(duì)象關(guān)聯(lián)參數(shù)value為每個(gè)Radiobutton指定一個(gè)唯一的值選中的Radio的值存儲(chǔ)在IntVar對(duì)象中set()方法設(shè)置IntVar對(duì)象的值,get()方法獲取IntVar對(duì)象的值還可以使用command參數(shù)指定回調(diào)函數(shù)Check按鈕復(fù)選按鈕Checkbutton使用IntVar對(duì)象和Check按鈕相關(guān)聯(lián)一個(gè)Checkbutton與不同的IntVar對(duì)象相關(guān)聯(lián)選中Checkbutton時(shí),關(guān)聯(lián)的IntVar對(duì)象的值為1,否則為0參數(shù)variable與IntVar對(duì)象關(guān)聯(lián)set()方法設(shè)置IntVar對(duì)象的值,get()方法獲取IntVar對(duì)象的值還可以使用command參數(shù)指定回調(diào)函數(shù)Messagebox信息對(duì)話框importtkinter.messageboxshowinfo()函數(shù)顯示信息框tkinter.messagebox.showinfo(title,message)title是顯示在對(duì)話框的標(biāo)題欄中的字符串message是顯示在對(duì)話框的主體部分中顯示信息的字符串9.3Canvas組件第9章Tkinter實(shí)現(xiàn)GUI編程 9.3Canvas組件
在圖形用戶界面(GUI)編程中,Canvas是用于繪制圖形、圖像和動(dòng)畫(huà)的基礎(chǔ)組件,特別是在Python的Tkinter庫(kù)中,Canvas提供了豐富的圖形繪制功能。Canvas控件的主要作用包括:(1)繪制圖形:Canvas可用于繪制點(diǎn)、線、矩形、圓、橢圓、弧線、多邊形等各種形狀。(2)圖像展示:雖然Canvas主要不是用來(lái)顯示靜態(tài)圖像,但可以通過(guò)加載位圖文件(如PNG、JPEG)并將其放置在Canvas上實(shí)現(xiàn)。9.3Canvas組件(3)動(dòng)畫(huà)制作:通過(guò)不斷清除并重繪畫(huà)面,Canvas能制作簡(jiǎn)單的動(dòng)畫(huà)效果。(4)交互式圖形:在Canvas上可以綁定事件處理函數(shù),實(shí)現(xiàn)拖拽、點(diǎn)擊等交互式操作。(5)數(shù)據(jù)可視化:結(jié)合數(shù)據(jù)和算法,Canvas可以用來(lái)呈現(xiàn)圖表、流程圖以及其他形式的數(shù)據(jù)可視化內(nèi)容9.4TkinterGUI的應(yīng)用第9章Tkinter實(shí)現(xiàn)GUI編程【例9-8】設(shè)計(jì)一個(gè)登錄界面,包含用戶名輸入框、密碼輸入框、一個(gè)登錄按鈕、一個(gè)重置按鈕,以及一個(gè)顯示消息的標(biāo)簽。當(dāng)輸入用戶名和密碼正確時(shí),在標(biāo)簽Label上顯示登錄成功。
9.4小結(jié)第9章Tkinter實(shí)現(xiàn)GUI編程
本章引入Python標(biāo)準(zhǔn)庫(kù)--Tkinter庫(kù),它是專為快速開(kāi)發(fā)跨平臺(tái)的GUI應(yīng)用程序而設(shè)計(jì)。這章學(xué)習(xí)了如何導(dǎo)入Tkinter模塊,并理解了GUI編程的基本步驟,包括窗口創(chuàng)建、控件的添加及使用和Canvas畫(huà)布的使用;并通過(guò)兩個(gè)實(shí)例,進(jìn)一步對(duì)控件綜合性應(yīng)用加以說(shuō)明。
第10章游戲編程10.1引言第10章游戲編程10.1引言
pygame是一個(gè)利用SDL庫(kù)編寫的游戲庫(kù),使用它可以開(kāi)發(fā)具有全部特性的游戲和多媒體軟件。它極其輕便且可以運(yùn)行在幾乎所有的平臺(tái)和操作系統(tǒng)上,不僅提供了針對(duì)圖形和位圖的繪制函數(shù),還提供了用于用戶輸入,處理音頻播放和監(jiān)控鼠標(biāo)和鍵盤服務(wù)。pygame一般用于2D游戲的開(kāi)發(fā)。對(duì)于新手而言,從簡(jiǎn)單的2D入手是個(gè)好的選擇。10.2pygame安裝第10章游戲編程10.2pygame安裝安裝pygame主要有兩種方法:通過(guò)pip安裝:pip工具是python用于安裝軟件包的工具。在windows命令行狀態(tài)下輸入:通過(guò)IDE安裝。要檢查pygame是否已正確安裝,可以在IDE的解釋器中輸入以下命令:importpygame,然后回車。如果該命令成功運(yùn)行且未引發(fā)任何錯(cuò)誤,則表明已經(jīng)成功安裝了pygame。pipinstallpygame10.2pygame安裝pygame中有很多模塊。下面是常用模塊表:模塊名功能pygame.cdrom訪問(wèn)光驅(qū)pygame.cursors加載光標(biāo)pygame.display訪問(wèn)顯示設(shè)備pygame.draw繪制形狀、線和點(diǎn)pygame.event管理事件pygame.font使用字體pygame.image加載和存儲(chǔ)圖片pygame.joystick使用游戲手柄或者類似的東西pygame.key讀取鍵盤按鍵pygame.mixer聲音pygame.mouse鼠標(biāo)pygame.movie播放視頻pygame.music播放音頻pygame.overlay訪問(wèn)高級(jí)視頻疊加pygame.rect管理矩形區(qū)域pygame.sndarray操作聲音數(shù)據(jù)pygame.sprite操作移動(dòng)圖像pygame.surface管理圖像和屏幕pygame.surfarray管理點(diǎn)陣圖像數(shù)據(jù)pygame.time管理時(shí)間和幀信息pygame.transform縮放和移動(dòng)圖像10.3pygame基礎(chǔ)知識(shí)第10章游戲編程10.3pygame基礎(chǔ)知識(shí)10.3.1坐標(biāo)pygame坐標(biāo)系為傳統(tǒng)的笛卡爾坐標(biāo)系統(tǒng)。原點(diǎn)(0,0)位于窗口左上角,X軸自左向右,Y軸自上向下,單位為像素。10.3pygame基礎(chǔ)知識(shí)10.3.2顏色pygame使用RGB顏色系統(tǒng),用于描述顏色的類是pygame.color。該類有r、g、b、a四個(gè)屬性分別表示RGB顏色的紅、綠、藍(lán)和透明度四個(gè)分量。pygame還提供了一個(gè)命名顏色的列表THECOLORS:frompygame.colorimportTHECOLORSpygame.draw.circle(screen,THECOLORS[“red”],[100,100],30,0)10.3pygame基礎(chǔ)知識(shí)10.3.3字體pygame可以直接調(diào)用系統(tǒng)字體,也可以調(diào)用TTF字體。pygame.font為操作和表示字體的模塊。使用系統(tǒng)自帶字體:使用自己的TTF字體:myfont=pygame.font.SysFont(‘a(chǎn)rial’,16)myfont=pygame.font.Font(‘my_font.ttf’,16)10.4第一個(gè)pygame程序:簡(jiǎn)單的pie游戲第10章游戲編程10.4第一個(gè)pygame程序:簡(jiǎn)單的pie游戲pie游戲是一個(gè)非常簡(jiǎn)單的游戲,玩家獲勝時(shí)有一個(gè)小獎(jiǎng)品。游戲時(shí)以任意順序按下1、2、3和4。當(dāng)按下每個(gè)數(shù)字時(shí),就會(huì)繪制對(duì)應(yīng)的餅塊。當(dāng)所有4個(gè)餅塊完成之后,餅塊會(huì)改變顏色。游戲界面如圖所示:10.4第一個(gè)pygame程序:簡(jiǎn)單的pie游戲10.4.1使用pygame使用pygame的第一步是將pygame庫(kù)導(dǎo)入到python程序中,以便在程序中使用它:導(dǎo)入pygame中所有常量。這一步非必選,但操作后會(huì)讓代碼更整潔易讀。importpygamefrompygame.localsimport*10.4第一個(gè)pygame程序:簡(jiǎn)單的pie游戲10.4.2初始化并創(chuàng)建窗口初始化pygame:獲取對(duì)顯示系統(tǒng)的訪問(wèn),并創(chuàng)建一個(gè)窗口并設(shè)置大小。注意窗口寬度和高度要放在圓括號(hào)中。pygame.init()screen=pygame.display.set_mode((600,500))10.4第一個(gè)pygame程序:簡(jiǎn)單pie游戲給窗口添加標(biāo)題:給窗口填充顏色并更新窗口:pygame.display.set_caption("ThePieGame-Press1,2,3,4")screen.fill((0,0,200))pygame.display.update()10.4第一個(gè)pygame程序:簡(jiǎn)單pie游戲10.4.3打印文本首先創(chuàng)建一個(gè)字體:使用None參數(shù)會(huì)使用默認(rèn)pygame字體,60為字體大小。在Pygame中繪制文本并不是快速繪制到屏幕上,而是渲染到一個(gè)平面,然后再將其繪制到屏幕上。建議先在內(nèi)存中創(chuàng)建文本平面(或圖像),然后再將文本當(dāng)作一個(gè)圖像來(lái)繪制。myfont=pygame.font.Font(None,60)10.4第一個(gè)pygame程序:簡(jiǎn)單pie游戲要繪制文本,一般先清楚屏幕,然后使用screen.blit()繪制文本平面到指定區(qū)域,最后刷信顯示。10.4第一個(gè)pygame程序:簡(jiǎn)單pie游戲10.4.4事件循環(huán)每個(gè)游戲都有一個(gè)事件循環(huán),也稱主循環(huán)。主循環(huán)一般就做三件事:處理事件更新游戲狀態(tài)在屏幕上繪制游戲狀態(tài)事件循環(huán)用偽代碼表示如右所示:whileTrue:foreventinpygame.event.get():
處理事件event更新游戲狀態(tài)在屏幕上繪制游戲狀態(tài)10.5事件處理第10章游戲編程10.5事件處理pygame中完整的事件列表如下:從上表得知,pygame支持游戲手柄。事件產(chǎn)生途徑參數(shù)QUIT用戶按下關(guān)閉按鈕noneACTIVEEVENTPygame被激活或者隱藏gain,stateKEYDOWN鍵盤被按下unicode,key,modKENUP鍵盤被放開(kāi)key,modMOUSEMOTION鼠標(biāo)易懂pos,rel,buttonsMOUSEBUTTONUP鼠標(biāo)按下pos,buttonMOUSEBUTTONDOWN鼠標(biāo)放開(kāi)pos,buttonJOYAXISMOTION游戲手柄軸移動(dòng)joy,axis,valueJOYBALLMOTION游戲手柄球移動(dòng)joy,axis,valueJOYHATMOTION游戲手柄帽移動(dòng)joy,axis,valueJOYBUTTONUP游戲操縱桿按鈕按下joy,buttonJOYBUTTONDOWN游戲操縱桿按鈕松開(kāi)joy,buttonVIDEORESIZEPygame窗口縮放size,w,hVIDEOEXPOSEPygame窗口部分公開(kāi)noneUSEREVENT用戶自定義事件code10.5事件處理10.5.1鍵盤事件鍵盤事件包括KEYUP和KEYDOWN。如果要處理按鍵按下事件時(shí),響應(yīng)KEYDOWN事件;要處理按鍵松開(kāi)事件時(shí),響應(yīng)KEYUP事件。一般游戲中使用Escape鍵作為默認(rèn)的游戲退出鍵。響應(yīng)參考代碼如下:whileTrue: foreventinpygame.event.get(): ifevent.type==QUIT: sys.exit() elifevent.type==KEYDOWN: ifevent.key==pygame.K_ESCAPE: sys.exit()10.5事件處理10.5.2鼠標(biāo)事件pygame支持的鼠標(biāo)事件包括:MOUSEMOTION、MOUSEBUTTONUP和MOUSEBUTTONDOWN。當(dāng)鼠標(biāo)事件發(fā)生時(shí),有時(shí)還需要通過(guò)傳進(jìn)來(lái)的事件參數(shù)讀取事件屬性。10.5事件處理對(duì)于MOUSEMOTION事件,屬性是event.pos、event.rel和event.buttons。使用這些屬性的參考代碼如下:foreventinpygame.event.get(): ifevent.type==MOSUEMOTION: mouse_x,mouse_y=event.pos move_x,move_y=event.rel10.5事件處理對(duì)于MOUSEBUTTONDOWN和MOUSEBUTTONUP這兩個(gè)事件,屬性是event.pos和event.buttons。使用這兩個(gè)屬性的參考代碼:foreventinpygame.event.get(): ifevent.type==MOSUEBUTTONDOWN: mouse_down=event.button mouse_down_x,mouse_down_y=event.pos elifevent.type==MOUSEBUTTONUP: mouse_up=event.button mouse_up_x,mouse_up_y=event.pos10.5事件處理10.5.3設(shè)備輪詢pygame中的事件處理系統(tǒng)并非檢測(cè)用戶輸入的唯一方法,還可以通過(guò)輪詢輸入設(shè)備,來(lái)查看用戶是否與程序交互。10.5事件處理pygame使用pygame.key.get_pressed()來(lái)輪詢鍵盤接口,該方法返回布爾值列表,在列表中每個(gè)鍵都有一個(gè)True或False的標(biāo)志。通過(guò)鍵常量值來(lái)索引所得到的布爾值列表。通過(guò)輪詢所有鍵,也可以檢測(cè)多個(gè)鍵的按下。如檢測(cè)Escape鍵的代碼:keys=pygame.key.get_pressed()ifkeys[K_ESCAPE]: sys.exit()10.5事件處理pygame還可以直接輪詢鼠標(biāo)。此時(shí)需要了解3個(gè)函數(shù):pygame.mouse.get_pos():返回鼠標(biāo)當(dāng)前位置的x和y值對(duì)pygame.mouse.get_rel():返回鼠標(biāo)的相對(duì)移動(dòng)距離pygame.mouse.get_pressed():讀取鼠標(biāo)按鈕,返回按鈕狀態(tài)的一個(gè)數(shù)組pos_x,pos_y=pygame.mouse.get_pos()rel_x,rel_y=pygame.mouse.get_rel()button1,button2,button3=pygame.mouse.get_pressed()10.6基本繪制函數(shù)第10章游戲編程10.6基本繪圖函數(shù)常用繪圖方法:1)pygame.draw.line(Surface,color,start_pos,end_pos,width):此方法用于繪制一條線段;2)pygame.draw.aaline(Surface,color,start_pos,end_pos,blend):此方法用于繪制一條抗鋸齒的線;3)pygame.draw.lines(Surface,color,closed,pointlist,width):此方法用于繪制一條折線;4)pygam
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)餅干盒行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)陶瓷刀把行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)鋰長(zhǎng)石行業(yè)發(fā)展研究報(bào)告
- 汽車電氣設(shè)備構(gòu)造與維修 課件 項(xiàng)目五 汽車照明與信號(hào)系統(tǒng)維護(hù)及檢修
- 2025至2030年中國(guó)身高尺行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)船用化纖繩纜行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)聚丙烯酰胺干粉行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)組合式恒溫恒濕空調(diào)機(jī)組行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)粗平布行業(yè)發(fā)展研究報(bào)告
- 拔牙護(hù)理常規(guī)操作規(guī)范
- 創(chuàng)意美術(shù)《版畫(huà)恐龍化石》課件
- 電梯機(jī)房操作規(guī)程
- 魯科版四年級(jí)下冊(cè)英語(yǔ) 復(fù)習(xí)
- 餐飲業(yè)勞務(wù)合同
- 廣聯(lián)達(dá)BIM智慧工地
- 安全生產(chǎn)教育培訓(xùn)記錄表
- 電梯參數(shù)及配置要求
- -高考體育單招真題現(xiàn)代文專項(xiàng)閱讀匯編(含答案)-備戰(zhàn)2023屆高考體育單招語(yǔ)文一輪復(fù)習(xí)之現(xiàn)代文閱讀復(fù)習(xí)之一
- GB/T 3733.1-1983卡套式端直通管接頭
- GB/T 1689-1998硫化橡膠耐磨性能的測(cè)定(用阿克隆磨耗機(jī))
- GA/T 954-2011法庭科學(xué)工具痕跡中凹陷痕跡的檢驗(yàn)規(guī)范
評(píng)論
0/150
提交評(píng)論