版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1大學(xué)計(jì)算機(jī)基礎(chǔ)北京航空航天大學(xué)教學(xué)課件PythonPython簡(jiǎn)介簡(jiǎn)單易學(xué)解釋執(zhí)行面向?qū)ο罂梢浦残?注意:Python2.x和python3.x并不兼容好習(xí)慣的養(yǎng)成Python編碼規(guī)則縮進(jìn):Python的語(yǔ)法格式,在一行代碼前輸入若干空格表示行與行間的層次關(guān)系,Python中的縮進(jìn)是4個(gè)空格,且不能忽略冒號(hào):Python的語(yǔ)法格式,在if,while等語(yǔ)句后要緊跟冒號(hào)空行:不是Python的語(yǔ)法格式,函數(shù)間或類間用空行分隔,表示新代碼的開始Python的命名規(guī)則函數(shù)命名:必須以字母或下劃線開頭,可包含任意字母、數(shù)字或下劃線的組合;區(qū)分大小寫;不能是系統(tǒng)保留字類和對(duì)象命名:類名首字母需要大寫,其它字母小寫;類私有屬性和方法以兩個(gè)下劃線作前綴;對(duì)象命名用小寫字母包和模塊命名:均用小寫字母不要含下劃線Python語(yǔ)句注釋常規(guī)注釋:#開頭3條件語(yǔ)句順序執(zhí)行
根據(jù)指令輸入順序依次執(zhí)行跳轉(zhuǎn)執(zhí)行
根據(jù)邏輯表達(dá)式的值跳轉(zhuǎn)執(zhí)行4條件語(yǔ)句猜字(正確數(shù)字為5)從控制臺(tái)輸入一個(gè)數(shù)字判斷該數(shù)字是否是5如果是5,則輸出正確否則,則輸出失敗判斷用條件語(yǔ)句5print("Welcome!")#input函數(shù)用于從控制臺(tái)輸入內(nèi)容,返回string類型g=input("Guessthenumber:")#將string類型轉(zhuǎn)換為int類型guess=int(g)ifguess==5:#判斷語(yǔ)句print("Youwin!")ifguess>5orguess<5:##else:print("Youloose!")print("Gameover!")直接寫5好嗎?用變量代替好嗎?注意:程序中盡量不要直接使用具體值,最好用變量代替條件語(yǔ)句6條件語(yǔ)句邏輯條件判斷離不開邏輯邏輯表達(dá)式——用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯值連接起來(lái)的有意義的式子(x>3)邏輯值——True和False邏輯運(yùn)算符——and、or、not關(guān)系表達(dá)式——用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式(算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式、字符表達(dá)式)連接起來(lái)的式子(x>3andx<10)關(guān)系運(yùn)算符——用來(lái)比較關(guān)系運(yùn)算符兩邊的值并且得出一個(gè)邏輯值7關(guān)系運(yùn)算符含義優(yōu)先級(jí)與結(jié)合方向<<=>>=小于小于等于大于大于等于優(yōu)先級(jí)相同(高)結(jié)合方向(從左向右)==!=等于不等于優(yōu)先級(jí)相同(低)結(jié)合方向(從左向右)條件語(yǔ)句條件判斷
語(yǔ)句不再順次執(zhí)行,而是根據(jù)判斷條件執(zhí)行8if表達(dá)式
語(yǔ)句體if表達(dá)式:
語(yǔ)句體1else:
語(yǔ)句體2偽代碼Python語(yǔ)法-if語(yǔ)句條件語(yǔ)句if,ifelse和ifelif區(qū)別多個(gè)if中各條件語(yǔ)句間是并列關(guān)系,他們相互獨(dú)立ifelse或ifelif中各條件語(yǔ)句是遞進(jìn)關(guān)系,他們相互影響若表達(dá)同一含義,ifelse或ifelif執(zhí)行效率比if高。在ifelse中如果if條件滿足,則else不會(huì)執(zhí)行。而如果存在多個(gè)if語(yǔ)句,各if語(yǔ)句均要執(zhí)行條件判斷。如:當(dāng)輸入a=1,b=1時(shí),程序1輸出:a=1b=1;程序2輸出:a=19ifa==1:print(('a='),a)ifb==1:print(('b='),b)ifa==1:print(('a='),a)elifb==1:print(('b='),b)程序1程序2條件語(yǔ)句例1擴(kuò)展:猜字并給出正確建議(正確數(shù)字為5)從控制臺(tái)輸入一個(gè)數(shù)字判斷該數(shù)字是否是5如果是5,則輸出正確否則,判斷輸入數(shù)字大小如果大于5,則輸出太大如果小于5,則輸出過(guò)小多個(gè)判斷用條件嵌套10print("Welcome!")#input函數(shù)用于從控制臺(tái)輸入內(nèi)容,返回string類型g=input("Guessthenumber:")#將string類型轉(zhuǎn)換為int類型guess=int(g)ifguess==5:print("Youwin!")else:ifguess>5:print("Toohigh!")else:print("Toolow!")print("Gameover!")條件語(yǔ)句條件嵌套11if條件1為真:
執(zhí)行語(yǔ)句1elif條件2為真:執(zhí)行語(yǔ)句2else:執(zhí)行語(yǔ)句3Python語(yǔ)法-if嵌套if條件1為真:
執(zhí)行語(yǔ)句1else:if條件2為真:
執(zhí)行語(yǔ)句2else:執(zhí)行語(yǔ)句3Python語(yǔ)法-if嵌套條件語(yǔ)句12課堂練習(xí)1、判斷是否是閏年
能被4整除卻不能被100整除或能被400整除的年份是閏年提示:判斷是否能夠整數(shù)用%2、模擬用戶注冊(cè)
用戶名長(zhǎng)度在3~20之間;賬號(hào)必須是數(shù)字;電話號(hào)碼長(zhǎng)度必須是11位。提示:判斷數(shù)字用isdigit()函數(shù);計(jì)算長(zhǎng)度用len()函數(shù)。13循環(huán)語(yǔ)句例1擴(kuò)展:失敗后自動(dòng)重啟從控制臺(tái)輸入一個(gè)數(shù)字重復(fù)判斷該數(shù)字是否是5如果是5,則輸出正確,結(jié)束執(zhí)行否則,判斷輸入數(shù)字大小,返回初始位置重復(fù)執(zhí)行用循環(huán)14answer=0#定義循環(huán)條件while(answer==0):#循環(huán)語(yǔ)句
print("Welcome!")g=input("Guessthenumber:")guess=int(g)ifguess==5:answer=1print("Youwin!")else:ifguess>5:print("Toohigh!")else:print("Toolow!")print("Gameover!")循環(huán)語(yǔ)句循環(huán)語(yǔ)句
Python有兩類循環(huán)語(yǔ)句:while和for15While條件判斷:
循環(huán)體else:執(zhí)行語(yǔ)句for控制變量in可遍歷的表達(dá)式:
循環(huán)體else:執(zhí)行語(yǔ)句注意:當(dāng)循環(huán)次數(shù)不確定時(shí)用whilewhile:需要手動(dòng)改變條件控制變量for:系統(tǒng)自動(dòng)改變條件控制變量循環(huán)語(yǔ)句循環(huán)中的跳轉(zhuǎn)語(yǔ)句
Python有兩類循環(huán)跳轉(zhuǎn)語(yǔ)句:break和continuebreak:“跳出,結(jié)束”使流程從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)體下面的語(yǔ)句。Continue:“跳過(guò),回頂”結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。
16continue和break語(yǔ)句區(qū)別:continue語(yǔ)句只結(jié)束本次循環(huán),而不終止整個(gè)循環(huán)執(zhí)行。break語(yǔ)句是結(jié)束整個(gè)循環(huán)過(guò)程,不再判斷執(zhí)行循環(huán)的條件是否成立。循環(huán)語(yǔ)句提高效率提高效率就是少執(zhí)行代碼17answer=0#定義循環(huán)條件while(answer==0):#循環(huán)語(yǔ)句
print("Welcome!")g=input("Guessthenumber:")guess=int(g)ifguess==5:answer=1print("Youwin!")
breakelse:ifguess>5:print("Toohigh!")else:print("Toolow!")print("Gameover!")循環(huán)中常用三種關(guān)鍵字break:打斷,直接跳出循環(huán)continue:繼續(xù),不再執(zhí)行其后語(yǔ)句但繼續(xù)執(zhí)行下一條循環(huán)pass:過(guò),執(zhí)行循環(huán)操作,但不執(zhí)行任何實(shí)際語(yǔ)句循環(huán)語(yǔ)句循環(huán)中的迭代器實(shí)現(xiàn)循環(huán)最重要的是確定迭代器。迭代器就是能夠?qū)崿F(xiàn)從左到右、從上到下掃描的函數(shù)。迭代器內(nèi)部通過(guò)循環(huán)調(diào)用next方法和捕捉StopIterartion異常來(lái)實(shí)現(xiàn)對(duì)象的遍歷。18可迭代對(duì)象迭代器迭代功能文件realine逐行讀取文件內(nèi)容列表,元組,字典,字符串foritemin被遍歷對(duì)象:process(item)逐個(gè)讀取被遍歷對(duì)象中各元素值,不返回索引,只能對(duì)元素值順次處理,不靈活forindexinrange(len(被遍歷對(duì)象)):process((被遍歷對(duì)象[index])逐個(gè)讀取被遍歷對(duì)象中各元素值,返回索引,用獲得索引讀取值,靈活但繁瑣forindex,keyinenumerate(被遍歷對(duì)象):process(index,key)enumerate函數(shù)同時(shí)獲得索引和值,靈活快速課堂練習(xí)1、九九乘法表2、查找并替換Namelist=[‘Kate’,’Lily’,’John’,’Guy’],將John替換為Jake3、關(guān)鍵字搜索searchlist=[‘長(zhǎng)春花’,‘珍珠花’,‘向日葵’,‘風(fēng)鈴草’,‘金盞菊’,‘夾竹桃’,‘大麗花’],用戶輸入關(guān)鍵字查詢是否存在19注意何時(shí)換行?print(end=“”)#強(qiáng)制輸入完畢不換行print(‘\n’)#強(qiáng)制輸入完畢換行Print默認(rèn)自動(dòng)換行導(dǎo)入包例1擴(kuò)展:正確數(shù)字隨機(jī)生成正確數(shù)字由計(jì)算機(jī)隨機(jī)生成而非人為設(shè)定內(nèi)置函數(shù)Python自帶很多內(nèi)置函數(shù),這些函數(shù)各具功能,可省去自編之苦import:函數(shù)在使用前必須導(dǎo)入所屬包module:函數(shù)在Python中以模塊形式存在20總結(jié)程序程序是一組指令的集合普通指令執(zhí)行事情條件指令決定事情循環(huán)指令重復(fù)事情21數(shù)據(jù)結(jié)構(gòu)-列表例:超市貨品快速查找系統(tǒng)超市貨品種類很多,且每天需要不斷增加新貨或下架舊貨,故提供一個(gè)快速便捷的物品位置查詢系統(tǒng)非常必要。貨品是按首字的漢語(yǔ)拼音排序擺放的。添加新貨品查詢貨品刪除舊貨品22開始查詢是否存在該貨品?輸入新貨品添加到貨架不添加到貨架查詢貨品位置刪除舊貨品查詢是否存在該貨品?存在則刪除不存在則提示結(jié)束是否是否數(shù)據(jù)結(jié)構(gòu)-列表數(shù)據(jù)結(jié)構(gòu)1:列表
列表是用一對(duì)方括號(hào)處理一組有序項(xiàng)目的數(shù)據(jù)結(jié)構(gòu),各項(xiàng)目間用逗號(hào)區(qū)分,且長(zhǎng)度不固定。格式:listname=[element1,element2,…]添加:listname.append(value)或listname.insert(index,value)刪除:listname.remove(value)或dellistname(index)查找:valuein
list,存在返回True,不存在返回False注意:list中index始于0,止于len(index)-123數(shù)據(jù)結(jié)構(gòu)擴(kuò)展:文件操作
為了在程序執(zhí)行完后仍保存結(jié)果,可用文件實(shí)現(xiàn)。打開:fileobject=open(‘/路徑/文件名.后綴名’)關(guān)閉:fileobject.close()讀?。篺ileobject.read()或fileobject.readline()或fileobject.readlines()寫入:fileobject=open(‘/路徑/文件名.后綴名’,‘a(chǎn)’)
fileobject=write(‘寫內(nèi)容’)fileobject=writeline(‘寫內(nèi)容’)注意:(1)文件在打開時(shí)默認(rèn)是只讀模式,如果想寫入必須修改為可寫模式,修改模式在open函數(shù)中實(shí)現(xiàn)。
(2)文件讀取時(shí)有三種方法:read(),readline()和readlines()
(3)文件寫入時(shí)兩種方法24數(shù)據(jù)結(jié)構(gòu)25read()每次讀取整個(gè)文件,它通常用于將文件內(nèi)容放到一個(gè)字符串變量中readline()每次讀取一行文件,返回一行字符串readlines()每次讀取整個(gè)文件,返回包含文件所有內(nèi)容的字符串列表,每個(gè)元素是一行的字符串write()寫入內(nèi)容后光標(biāo)在行末不會(huì)換行,下次寫會(huì)接著這行寫writeline()寫入內(nèi)容后光標(biāo)跳到下一行起始位置,下次寫會(huì)在新行數(shù)據(jù)結(jié)構(gòu)-元組例:水果查詢系統(tǒng),不同季節(jié)盛產(chǎn)什么水果一查便知。數(shù)據(jù)結(jié)構(gòu)2:元組元組適合存儲(chǔ)一組固定數(shù)據(jù),元組和列表的唯一區(qū)別是建立后長(zhǎng)度和值均不能修改格式:tuplename=(element1,element2,…)訪問(wèn):tuplename[index]二元組:tupletuple=(tuple1,tuple2,…)訪問(wèn)二元組:tupletuple[indexi][indexj]單個(gè)元素的元組:onetuple=(elements1,)逗號(hào)不能省略26數(shù)據(jù)結(jié)構(gòu)-字典例:用戶賬號(hào)管理系統(tǒng),包括注冊(cè)賬戶,登錄已有賬戶、驗(yàn)證是否登錄成功等。
注冊(cè)有用戶名和密碼,且一一對(duì)應(yīng),如何便捷存儲(chǔ)他們?數(shù)據(jù)結(jié)構(gòu)3:字典
字典由一系列“key-value”對(duì)組成,各字典元素對(duì)間無(wú)序,通過(guò)映射方式存儲(chǔ)。格式:dicname={key1:value1,key2:value2,…}添加:dicname.setdefault(key,[,defaultvalue])刪除:del(dicname[key])訪問(wèn):dicname.get(key)27異常擴(kuò)展:捕捉和處理異常
通過(guò)編程可以捕捉和處理各種異常,使得程序不因異常而終止。Python捕捉異常有兩種方式:raise和tryexcept。方法1:raise強(qiáng)行產(chǎn)生內(nèi)置異常格式:raise.Exceptionname('errormessage')28x=int(input('enterthedividend'))y=int(input('enterthedivisor'))printx/y#如果y=0,則報(bào)錯(cuò)ZeroDivisionErrorx=int(input('enterthedividend'))y=int(input('enterthedivisor'))ify==0:raiseZeroDivisionError('Thezeroisnotallow')print(x/y)家丑不可外揚(yáng)數(shù)據(jù)結(jié)構(gòu)方法2:tryexcept
自定義各種異常格式:打?。鹤⒁猓?1)一般很難事先知道異常類型或分析出所有異常,所以常用Exception代替各具體異常。(2)一般常用tryexcept而不用raise。29try:x=int(input('enterthedividend'))y=int(input('enterthedivisor'))printx/yexceptZeroDivisionError:print(‘thedivisorshouldnotbezero!')try:
執(zhí)行原語(yǔ)句except(異常名稱1,異常名稱2,…)
執(zhí)行報(bào)錯(cuò)語(yǔ)句try:
執(zhí)行原語(yǔ)句except(異常名稱1,異常名稱2,…)aseprint(e)#打印異常,程序正常執(zhí)行程序組成-指令單條指令
默認(rèn)狀態(tài)下,程序由一條條指令組成,按從上到下順序執(zhí)行。例:繪制一個(gè)心形30print('****')print('****')print('***')print('**')print('**')print('*')挑戰(zhàn)下!程序組成-函數(shù)例:兩個(gè)山洞中住著善、惡兩只恐龍。游戲規(guī)則:一次只能進(jìn)入一個(gè)山洞,善良恐龍會(huì)贈(zèng)予你寶藏;邪惡恐龍會(huì)將你吃掉。試試運(yùn)氣吧!31重復(fù)執(zhí)行的代碼一遍遍編寫很麻煩,有什么精簡(jiǎn)辦法嗎?程序組成-函數(shù)自定義函數(shù)可以將使用率高、解決特定功能的若干條指令聚集在一起,自定義為一個(gè)函數(shù),不僅方便使用,且減少代碼重復(fù)輸入。保留字:def函數(shù)名:見名知意,避免與關(guān)鍵字或內(nèi)置函數(shù)重名函數(shù)調(diào)用:函數(shù)名(實(shí)參),參數(shù)可以有0個(gè)、1個(gè)或多個(gè)函數(shù)返回值:return
返回值函數(shù)書寫規(guī)范:函數(shù)體縮排4個(gè)空格,勿忘冒號(hào)函數(shù)工作流程:在函數(shù)名位置被調(diào)用->傳遞所需參數(shù)->返回執(zhí)行結(jié)果(返回結(jié)果可為空)函數(shù)特點(diǎn)函數(shù)可以被重復(fù)使用一個(gè)函數(shù)中可以調(diào)用其他函數(shù)可以用import將其他函數(shù)文件導(dǎo)入當(dāng)前函數(shù)文件,
from函數(shù)文件名import*32程序組成-函數(shù)33deffunction_name(arg1,arg2[,…]):statement[returnvalue]注意:(1)函數(shù)定義必須放在函數(shù)調(diào)用前,否則編譯器會(huì)由于找不到該函數(shù)而報(bào)錯(cuò)。(2)帶有函數(shù)的程序在執(zhí)行時(shí)要從函數(shù)外的第一條指令處順序執(zhí)行,遇函數(shù)調(diào)用時(shí),轉(zhuǎn)向被調(diào)用函數(shù)名處執(zhí)行,執(zhí)行完畢后返回被調(diào)用處繼續(xù)順序執(zhí)行defchooseCave():#函數(shù)調(diào)用
cave=''whilecave!='1'andcave!='2':print('Whichcavewillyougointo?(1or2)')cave=input()
returncave#函數(shù)返回值程序組成-類和對(duì)象現(xiàn)實(shí)世界中的類和對(duì)象類:是具有相同屬性和行為的一組對(duì)象的集合,為屬于該類的全部對(duì)象提供了抽象的描述。任何對(duì)象都是某個(gè)類的實(shí)例。對(duì)象:是對(duì)現(xiàn)實(shí)世界中實(shí)物的描述,它表示將實(shí)物的靜態(tài)屬性和動(dòng)態(tài)行為封裝在一起的實(shí)體。34屬性行為表針其他機(jī)械結(jié)構(gòu)調(diào)節(jié)旋鈕程序組成-類和對(duì)象類和對(duì)象的關(guān)系
猶如模具與鑄件之間的關(guān)系,一個(gè)屬于某類的對(duì)象稱為該類的一個(gè)實(shí)例。35類的一個(gè)具體實(shí)現(xiàn),稱為實(shí)例手表
一塊手表類
對(duì)象描述這類對(duì)象共有的、本質(zhì)的屬性和行為手表共有的屬性(表針、旋鈕、內(nèi)部結(jié)構(gòu))和行為(調(diào)節(jié)旋鈕)具體到一只圓形的或方形的手表抽象定義具體實(shí)例程序組成-類和對(duì)象程序設(shè)計(jì)中的類和對(duì)象類:對(duì)象的集合。對(duì)象:類的實(shí)例。Python中的類和對(duì)象如何表示一個(gè)坐標(biāo)點(diǎn)(x,y)?
在Python提供的用于表示一組數(shù)據(jù)的已有類中,如list,tuple和dictionary都不能很好的表示坐標(biāo)點(diǎn)特性——x和y是一個(gè)整體。自定義一個(gè)類:方法1:創(chuàng)建時(shí)確定類中變量和函數(shù)方法2:創(chuàng)建時(shí)只確定類名36class類名:
def方法名1(self[,arg2,…])
函數(shù)體方法:類中定義的函數(shù)屬性:類中定義的變量class類名:pass#占位符無(wú)實(shí)際含義類名后無(wú)括號(hào)有冒號(hào)程序組成-類和對(duì)象例:坐標(biāo)點(diǎn)和距離37importmathclassmyPoint:passdefmyDis(self,x,y):#處于類外print(math.sqrt(x*x+y*y))point=myPoint()
#類實(shí)例化對(duì)象myPoint.myDis=myDis#myPoint.myDis中的函數(shù)名可另起名point.x=10point.y=20point.myDis(point.x,point.y)importmathclassmyPoint:
defmyDis(self):print(math.sqrt(self.x*self.x+self.y*self.y))point=myPoint()point.x=10point.y=20point.myDis()方法1方法2注意:類其實(shí)是由變量和方法兩部分組成的程序組成-類和對(duì)象類中各種變量類變量:在類中函數(shù)外創(chuàng)建的變量,整個(gè)類有效,各實(shí)例共享self.變量名實(shí)例變量:在函數(shù)中創(chuàng)建的變量,僅該函數(shù)內(nèi)有效,各實(shí)例獨(dú)有實(shí)例公有變量:self.變量名,實(shí)例直接訪問(wèn)實(shí)例私有變量:self.__變量名,實(shí)例間接訪問(wèn),格式為“實(shí)例._類名__變量名”
局部變量:變量名,只能在函數(shù)內(nèi)部訪問(wèn)注意:私有變量名前面的是雙下滑線,類名前面的是單下劃線38實(shí)例1實(shí)例變量1類變量實(shí)例變量2實(shí)例2對(duì)類變量的修改會(huì)影響各實(shí)例私有變量是否是畫蛇添足呢?程序組成-類和對(duì)象例:圓心計(jì)算半徑,周長(zhǎng)和面積print(self.radius)#正確print(self.area)#報(bào)錯(cuò):'myPoint'objecthasnoattribute'area'print(self.__cir)#報(bào)錯(cuò):'myPoint'objecthasnoattribute'__cir'print(self._myPoint__cir)#正確39importmathclassmyPoint():x0=1#類變量y0=2defmyDis(self):
#公有實(shí)例變量
self.radius=math.sqrt((self.x-self.x0)*(self.x-self.x0)+(self.y-self.y0)*(self.y-self.y0))area=math.pi*math.pow(self.radius,2)#局部變量
self.__cir=2*math.pi*self.radius#私有實(shí)例變量,注意是長(zhǎng)下劃線
_____________#填寫print函數(shù)
point=myPoint()point.x=3point.y=4point.myDis()程序組成-類和對(duì)象類中各種方法靜態(tài)方法:用@staticmethod定義且方法中不帶參數(shù),類和實(shí)例均可使用但不常用,類.靜態(tài)方法()或?qū)嵗?靜態(tài)方法()類方法:用@classmethod定義且最少帶一個(gè)self參數(shù),類和實(shí)例均可使用,類.靜態(tài)方法([arg])或?qū)嵗?靜態(tài)方法([arg])實(shí)例方法:無(wú)需特殊定義且最少帶一個(gè)self參數(shù),僅由實(shí)例使用,實(shí)例.實(shí)例方法([arg])私有方法:內(nèi)置方法:Python自帶的特殊方法__init__方法:用于對(duì)象初始化,在類的對(duì)象被建立時(shí),立刻自動(dòng)運(yùn)行。__del__方法:用于釋放被占用空間,但需要顯示調(diào)用40注意:(1)類方法中不能使用類中各種變量,只能使用函數(shù)中的形參(2)類方法不需要通過(guò)實(shí)例即可直接調(diào)用,使用快捷、方便;但占內(nèi)存空間,不易大量創(chuàng)建程序組成-類和對(duì)象41importmathclassmyPoint():def__init__(self):#構(gòu)造函數(shù),實(shí)例被創(chuàng)建時(shí)自動(dòng)被調(diào)用self.x0=1self.y0=1
@classmethoddefmyArea(self,r):#類函數(shù),類直接調(diào)用無(wú)需實(shí)例化area=math.pi*math.pow(r,2)print(area)defmyDis(self):self.radius=math.sqrt((self.x-self.x0)*(self.x-self.x0)+(self.y-self.y0)*(self.y-self.y0))print(self.radius)returnself.radius
point=myPoint()point.x=3point.y=4point.myDis()#實(shí)例方法需用實(shí)例調(diào)用myPoint.myArea(point.myDis())#直接用類調(diào)用,直接傳參數(shù)程序組成-類和對(duì)象例:新生報(bào)到42classPerson:population=0def__init__(self,name):#構(gòu)造函數(shù)=nameprint()Person.population+=1def__del__(self):#析構(gòu)函數(shù)print(self,name)Person.population-=1ifPerson.population==0:print('Iamthelastone')else:print('Therearestill%dstudentsleft',Person.population)defsayHi(self):print('Hi,mynameis%s'%())defhowMany(self):ifPerson.population==1:print('Iamtheonlyonestudenthere')else:print('Wehave%dstudentshere'%(Person.population))lily=Person('lily')lily.sayHi()lily.howMany()kate=Person('kate')kate.sayHi()kate.howMany()lily.__del__()lily.sayHi()#報(bào)錯(cuò)程序組成-類和對(duì)象
表類的內(nèi)置方法43程序組成-類和對(duì)象繼承
類可以創(chuàng)建其子類,則該類稱之為父類。共享:子類繼承父類所有的屬性和方法,子類
父類區(qū)別:子類可重新定義父類的某些屬性和方法或創(chuàng)建自己的屬性和方法,子類≠父類層次:子類仍可定義自己的子類,即其父類的孫類優(yōu)點(diǎn):繼承的主要優(yōu)點(diǎn)是代碼重用格式:classclass_sonname(class_fathername)繼承:父類.方法([arg])44∪汽車客車貨車小轎車大客車載貨載人小,速度快大,速度慢程序組成-類和對(duì)象例:師生如父子45classSchoolMember:def__init__(self,name,age):=nameself.age=agedeftell(self):print('Name:%s,Age:%s'%(,self.age))classTeacher(SchoolMember):#SchoolMember的子類Teacherdef__init__(self,name,age,salary):#子類重構(gòu)了父類的__init__方法
SchoolMember.__init__(self,name,age)#繼承父類方法
self.salary=salaryprint('InitializedTeacher:%s'%())deftell(self):#子類重構(gòu)了父類的tell方法
SchoolMember.tell(self)#繼承父類方法
print('Salary:%d'%(self.salary))classStudent(SchoolMember):#SchoolMember的子類Studentdef__init__(self,name,age,marks):#子類重構(gòu)了父類的__init__方法
SchoolMember.__init__(self,name,age)self.marks=marksprint('InitializedStudent:%s'%())deftell(self):#子類重構(gòu)了父類的tell方法
SchoolMember.tell(self)print('Marks:%d'%(self.marks))能否修改為私有變量self._age?報(bào)錯(cuò)。私有變量是父類私有且子類不能繼承的。由此可見,私有變量對(duì)數(shù)據(jù)起到保護(hù)作用t=Teacher(lily',40,30000)t.tell()程序組成-類和對(duì)象多重繼承子類可以同時(shí)繼承多個(gè)父類格式:classclass_sonname(class_fathername1,
class_fathername2,…)例:家族遺傳46classmyFather:def__init__(self):self.eyes='爸爸的眼睛是雙眼皮'print(self.eyes)classmyMother:def__init__(self):self.forehead='媽媽的額頭有點(diǎn)寬'classmySelf(myFather,myMother):#同時(shí)繼承父親類和母親類def__init__(self,face):print('我繼承了')myFather.__init__(self)print('我繼承了')myMother.__init__(self)self.face=faceprint('可是我的臉型是%s'%(self.face))mylook=mySelf('圓臉')程序組成-模塊模塊(module)
模塊即*.py文件,它是把一組相關(guān)函數(shù)、類或代碼保存在一個(gè)文件中形成的。其中,類和函數(shù)可以有0到多個(gè)。模塊定義:模塊即為*.py文件文件名不能以中文命名,否則導(dǎo)入時(shí)報(bào)錯(cuò)模塊使用:調(diào)用模塊用import命令文件名.函數(shù)名,文件名.類名補(bǔ)充:import路徑import導(dǎo)入文件的默認(rèn)路徑是sys.path47其實(shí)你已經(jīng)創(chuàng)建很多屬于自己的模塊了注意:導(dǎo)入的模塊要么放置在與輸入它的程序的同一個(gè)目錄中;要么用sys.path.append命令將所要導(dǎo)入文件的絕對(duì)路徑添加到默認(rèn)路徑中,如sys.path.append(‘c:/test’)。如何讓Python識(shí)別自定義導(dǎo)入的文件?在import中指定文件的絕對(duì)路徑是否有效?程序組成-包(有問(wèn)題????)包(packege)
包就是由很多模塊即*.py組成的目錄,即文件夾包的創(chuàng)建:新建文件夾,在文件夾中添加__init__.py文件、其他模塊或子文件夾__init__.py:
控制著包的導(dǎo)入行為為空,則僅導(dǎo)入包,其他什么都不做。添加內(nèi)容:__all__=[文件夾中文件或子文件夾名稱]包的使用:用import或fromimport命令方法一:將包放置到Python34\Lib中,使用時(shí)直接引用方法二:將包所在路徑添加到sys.path中,再引用48嘗試多次失敗?不知原因列表網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)IP地址:互聯(lián)網(wǎng)上計(jì)算機(jī)必須有唯一的編號(hào)才能上網(wǎng)端口:用于區(qū)分同一IP上的不同應(yīng)用服務(wù),0~1023為系統(tǒng)保留1024~65535為用戶自定義TCP/IP協(xié)議:傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,是面向連接的可靠協(xié)議UDP協(xié)議:用戶數(shù)據(jù)報(bào)協(xié)議,是無(wú)連接的不可靠協(xié)議Socket套接字:兩個(gè)程序之間的信息通道,用于描述IP地址和端口,是一個(gè)通信鏈的句柄。49端口1—socket1(響應(yīng)服務(wù)1)端口2—socket2(響應(yīng)服務(wù)2)端口3—socket3(響應(yīng)服務(wù)3)IP地址服務(wù)器客戶端端口1—socket1(請(qǐng)求服務(wù)1)端口2—socket2(請(qǐng)求服務(wù)2)端口3—socket3(請(qǐng)求服務(wù)3)兩個(gè)應(yīng)用程序通過(guò)套接字通信網(wǎng)絡(luò)編程Socket網(wǎng)絡(luò)編程服務(wù)器端:監(jiān)聽服務(wù)器端請(qǐng)求客戶端:主動(dòng)連接服務(wù)器端50網(wǎng)絡(luò)編程具體實(shí)現(xiàn)格式:socket(socket_family,socket_type,protocol=0)socket_family值為AF_UNIX或AF_INETsocket_type值為SOCK_STREAM或SOCK_DGRAMprotocol一般不賦值,即為0例:服務(wù)器發(fā)送消息,客戶端接收消息服務(wù)器:1)創(chuàng)建:創(chuàng)建服務(wù)器端socket對(duì)象s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)2)綁定:將socket綁定到指定地址,該地址必須是一個(gè)雙元素元組s.bind((host,port))3)監(jiān)聽:listen方法接收連接請(qǐng)求,可自定義允許連接的客戶端數(shù)目s.listen(connectnum)51host表示服務(wù)器主機(jī)名或IP地址網(wǎng)絡(luò)編程4)連接:服務(wù)器通過(guò)socket的accept方法等待客戶請(qǐng)求一個(gè)連接connection,address=s.accept()5)處理:服務(wù)器和客戶端通過(guò)send和recv方法通信s.send(data.encode())s.recv(recvnum)6)關(guān)閉:服務(wù)器調(diào)用socket的close()方法關(guān)閉連接s.close()客戶端:1)創(chuàng)建:創(chuàng)建客戶端socket對(duì)象s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)2)連接:客戶端使用socket的connect方法連接服務(wù)器s.connect((host,port))3)處理:服務(wù)器和客戶端通過(guò)send和recv方法通信4)關(guān)閉:客戶端調(diào)用socket的close()方法關(guān)閉連接52客戶端和服務(wù)器端協(xié)議和類型必須一致Python3需要對(duì)發(fā)送字節(jié)字符手動(dòng)編碼和解碼recvnum必須是正整數(shù),表示可接收的最大數(shù)據(jù)量注意是返回是元組客戶端連接的是服務(wù)器主機(jī)名和端口,客戶端端口隨機(jī)分配網(wǎng)絡(luò)編程53importsockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創(chuàng)建服務(wù)器端套接字host=socket.gethostname()#獲取服務(wù)器主機(jī)名或主機(jī)地址port=1234#指定端口號(hào)s.bind((host,port))#服務(wù)器將socket綁定到主機(jī)地址和端口s.listen(5)#設(shè)置允許連接的客戶端個(gè)數(shù),形成隊(duì)列whileTrue:#返回元組,c為連接建立后新的socket對(duì)象,服務(wù)器必須用該socket和客戶端通信;address是客戶端的ip地址c,addr=s.accept()
print(addr)data='welcome'#python3需要對(duì)字節(jié)字符串手動(dòng)編碼,也可以用c.send(b'welcome')c.send(data.encode())c.close#關(guān)閉連接importsockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#客戶端創(chuàng)建socket對(duì)象host=socket.gethostname()port=1234s.connect((host,port))#客戶端連接服務(wù)器print(s.recv(1024).decode())#客戶端接收從服務(wù)器端發(fā)送的數(shù)據(jù)并手動(dòng)解碼s.close()服務(wù)器客戶端注意:運(yùn)行順序——先啟動(dòng)服務(wù)器,再啟動(dòng)客戶端網(wǎng)絡(luò)編程例:服務(wù)器收發(fā)消息,客戶端首發(fā)消息服務(wù)器監(jiān)聽客戶端,當(dāng)收到客戶端消息后判斷執(zhí)行何種動(dòng)作客戶端向服務(wù)器發(fā)送消息54importsockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創(chuàng)建服務(wù)器端套接字host=socket.gethostname()#獲取服務(wù)器主機(jī)名或主機(jī)地址port=8001#指定端口號(hào)s.bind((host,port))#服務(wù)器將socket綁定到主機(jī)地址和端口s.listen(5)#設(shè)置允許連接的客戶端個(gè)數(shù),形成隊(duì)列whileTrue:c,addr=s.accept()#返回元組,c為連接建立后新的socket對(duì)象,服務(wù)器必須用該socket和客戶端通信;address是客戶端的ip地址
try:
c.settimeout(5)#設(shè)置時(shí)間延遲
buf=c.recv(1024).decode()#接收客戶端消息ifbuf=='s':data='welcometoserver'c.send(data.encode())else:data='pleasegoout'c.send(data.encode())exceptsocket.timeout:print('timeout')c.close#關(guān)閉連接服務(wù)器網(wǎng)絡(luò)編程55importsocketimporttimes=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#客戶端創(chuàng)建socket對(duì)象host=socket.gethostname()port=8001s.connect((host,port))time.sleep(2)data='s's.send(data.encode())print(s.recv(1024).decode())#客戶端接收從服務(wù)器端發(fā)送的數(shù)據(jù)并手動(dòng)解碼s.close()客戶端網(wǎng)絡(luò)編程例:聊天室客戶端手動(dòng)連接客戶端和服務(wù)器端互相通信有結(jié)束標(biāo)識(shí)56importsocketimporttimes=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=input("請(qǐng)輸入您想連接的主機(jī)名\n")port=int(input("請(qǐng)輸入服務(wù)器端口號(hào)(1025-9999)\n"))s.connect((host,port))whileTrue:data=input("學(xué)生說(shuō):\n")s.sendall(data.encode())recvcon=s.recv(1024).decode()ifrecvcon=='q':print("聊天結(jié)束")breakprint(recvcon)time.sleep(2)s.close()客戶端網(wǎng)絡(luò)編程57importsocketimporttimes=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=socket.gethostname()print("服務(wù)器名為:",host)port=int(input("請(qǐng)輸入服務(wù)器端口號(hào)(1025-9999)\n"))s.bind((host,port))s.listen(10)c,addr=s.accept()print('接收到來(lái)自消息',addr)whileTrue:recvcon=c.recv(1024).decode()ifrecvcon=='q':data='q'c.sendall(data.encode())print("聊天結(jié)束")breakprint(recvcon)data=input("老師說(shuō):\n")c.sendall(data.encode())s.close()服務(wù)器網(wǎng)絡(luò)編程例:服務(wù)器將文件傳輸給客戶端客戶58網(wǎng)絡(luò)編程異步通信和同步通信同步通信:如果客戶端有多個(gè)請(qǐng)求,服務(wù)器必須一個(gè)一個(gè)處理異步通信:如果客戶端有多個(gè)請(qǐng)求,服務(wù)器可以同時(shí)處理SocketServer分叉處理
當(dāng)多個(gè)連接同時(shí)到達(dá)服務(wù)器時(shí),主進(jìn)程會(huì)為每個(gè)連接生成一個(gè)子進(jìn)程,而主進(jìn)程繼續(xù)監(jiān)聽。主進(jìn)程和子進(jìn)程同時(shí)運(yùn)行,新的連接不會(huì)被阻塞。但生成進(jìn)程會(huì)消耗資源,因此SocketServer會(huì)存在性能問(wèn)題59GUI實(shí)參和形參
實(shí)參的個(gè)數(shù),類型應(yīng)與形參一一對(duì)應(yīng)。形參:在定義函數(shù)時(shí)使用的參數(shù),用來(lái)接收調(diào)用該函數(shù)時(shí)傳入的參數(shù)。在調(diào)用函數(shù)時(shí),形參被創(chuàng)建并被賦實(shí)參值。實(shí)參:在調(diào)用函數(shù)時(shí)使用的參數(shù),必須具有確定的值。實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等。全局變量和局部變量創(chuàng)建位置不同全局變量:建立在函數(shù)外的變量局部變量:建立在函數(shù)中的變量?jī)烧呱芷诓煌肿兞浚撼绦驁?zhí)行完畢,生命周期結(jié)束局部變量:函數(shù)執(zhí)行完畢,生命周期結(jié)束60GUI各函數(shù)中局部變量互不可見,如何溝通?參數(shù)傳遞全局變量61defquestion(name):print('Mynameis'+name)print('Whatisyourname?')my_name=input()question(my_name)defquestion():print('Mynameis'+my_name)print('Whatisyourname?')my_name=input()question(my_name)defshowname(name):print('thestringis'+name)print('pleaseinputastring')name=input()print('thestringis'+name)print('pleaseinputastring')name=input()showname(name)print('thestringis'+name)注意:Python中全局變量和局部變量即便重名,其在內(nèi)存中也是存儲(chǔ)兩個(gè)變量,它們相互獨(dú)立總結(jié)1、逐條輸出,而非一次輸出
time函數(shù)應(yīng)用:time.sleep(2)2、同類型才可比較,需做類型轉(zhuǎn)換
int(字符)str(數(shù)字)
提示:(1)input輸入是字符類型(2)Python定義變量無(wú)需先確定類型3、程序入口
Python中沒(méi)有顯示的main函數(shù),其函數(shù)入口即除去def后的第一條語(yǔ)句4、區(qū)分大小寫
Python區(qū)分大小寫,執(zhí)行案例,輸入”YES”和”yes”結(jié)果不同。62GUI練習(xí):1、成績(jī)判斷:優(yōu)、良、可、差。規(guī)則:成績(jī)>=90為優(yōu)秀;80<=成績(jī)<90為良;
70<=成績(jī)<80為可;
成績(jī)<7為差;提示:注意邏輯表達(dá)式的書寫2、判斷輸入的一個(gè)字符是字母還是數(shù)字?提示:①isalpha()和isdigit()函數(shù)的使用②注意if和ifelse的區(qū)別63GUIGUI(GraphicUserInterface)
沒(méi)有一件事情能夠離開代碼實(shí)現(xiàn)!但還是比C簡(jiǎn)單多了!確定界面內(nèi)容——繪制草圖確定界面功能——聯(lián)想、仿真和模擬將界面內(nèi)容和界面功能綁定——觸發(fā)行為對(duì)應(yīng)響應(yīng)事件隨時(shí)等待用戶輸入——確定的一行代碼術(shù)語(yǔ)Widget:界面上的各種部件,button,label,menuContainer:裝部件的容器Event:界面上各部件能夠響應(yīng)的事件,mouseclicksorpressesofakeyonthekeyboardBind:將界面內(nèi)容和事件綁定,bindasingle-clickoftheleftmousebuttononEventloop:事件循環(huán),等待輸入觸發(fā)事件執(zhí)行64GUIPython繪制GUI
必須導(dǎo)入GUI工具包。Tkinter是python3.2以上自帶版本測(cè)試Tkinter
65importTkinterTraceback(mostrecentcalllast):File"<pyshell#2>",line1,in<module>fromTkinterimport*ImportError:Nomodulenamed'Tkinter'輸出該結(jié)果說(shuō)明系統(tǒng)沒(méi)有安裝Tkinter包GUI例1:窗體首先:要導(dǎo)入tkinter包,兩種導(dǎo)入方式:import包from包import特定成員(函數(shù)或變量)或全部(*)其次:要?jiǎng)?chuàng)建窗體對(duì)象tkinter.Tk()最后:調(diào)用窗體對(duì)象的mainloop方法
66importtkinter#導(dǎo)入包root=tkinter.Tk()#窗體對(duì)象root.mainloop()#事件循環(huán)fromtkinterimport*#導(dǎo)入包root=Tk()#窗體對(duì)象root.mainloop()#事件循環(huán)注意:①fromimport中特定成員被直接導(dǎo)入到局部名字空間,所以它可以直接使用,而不需要加上模塊名的限定。②盡量少用frommoduleimport,因?yàn)榕卸ㄒ粋€(gè)特殊的函數(shù)或?qū)傩允菑哪膩?lái)的有些困難,并且會(huì)造成調(diào)試和重構(gòu)都更困難。GUI例2:顯示一個(gè)按鈕首先,創(chuàng)建窗體:創(chuàng)建窗體對(duì)象tkinter.Tk()其次,創(chuàng)建組件:創(chuàng)建Button對(duì)象:
Button(parent,[屬性列表]),parent是組件所在父組件設(shè)置Button屬性:名稱、大小、背景顏色等最后,顯示組件:必須用布局管理器將組件顯示在其所在父組件上三種方法:(1)組件.pack(option=value)(2)組件.gird(option=value)(3)組件.place(option=value)67窗體組件組件組件importtkinter#導(dǎo)入包root=tkinter.Tk()#窗體對(duì)象myButton=tkinter.Button(root)#按鈕對(duì)象myButton["text"]="Hello,World!"#按鈕名稱屬性myButton["background"]="green“#按鈕背景屬性myButton.pack()#顯示組件root.mainloop()#事件循環(huán)GUI例2擴(kuò)展:顯示兩個(gè)按鈕通過(guò)放置次序可有限制的控制組件位置通過(guò)布局管理器可以隨心所欲的擺放組件位置68importtkinter#導(dǎo)入包root=tkinter.Tk()#窗體對(duì)象myButton1=tkinter.Button(root)#按鈕對(duì)象myButton1["text"]="Hello,World!"#按鈕名稱屬性myButton1["background"]="green"#按鈕背景屬性myButton1.pack(tkinter.RIGHT)#顯示組件myButton2=tkinter.Button(root)#按鈕對(duì)象myButton2["text"]="Python!"#按鈕名稱屬性myButton2["background"]="red"#按鈕背景屬性myButton2.pack(tkinter.LEFT)#顯示組件root.mainloop()#事件循環(huán)GUI例2擴(kuò)展:1、幾種設(shè)置組件屬性方法:2、幾種布局組件方法:69myButton["text"]="Hello,World!"myButton["background"]="green"#方法(1)myButton.configure(text="Hello,World!")myButton.configure(background=“green")#方法(2)myButton.configure(text="Hello,World!",background=“green")#方法(3)myButton=Button(root,text="Hello,World!",background=“green")#方法(4)myButton.pack(side=tkinter.RIGHT)#place按父組件位置布局myButton.grid(row=0,column=0,sticky=tkinter.N)#grid按行列位置布局myButton.place(x=0,y=0,anchor=tkinter.NW)#place按坐標(biāo)系位置布局#常用pack和grid方法GUI3、tkinter中15個(gè)核心組件:70序號(hào)組件名稱組件描述1Button按鈕,響應(yīng)各類事件2Canvas圖形容器,繪制圖表和圖,創(chuàng)建圖形編輯器,實(shí)現(xiàn)定制窗口部件3Checkbutton多選按鈕,代表一個(gè)變量,有兩個(gè)不同值。點(diǎn)擊該按鈕將會(huì)在兩個(gè)值間切換4Entry文本輸入域5Frame窗體容器,用來(lái)布局內(nèi)部組件,可以有邊框和背景6Label顯示一個(gè)文本或圖象7Listbox列表,能夠被配置來(lái)得到radiobutton或checklist的行為8Menu菜單條。用來(lái)實(shí)現(xiàn)下拉和彈出式菜單9Menubutton菜單按鈕,實(shí)現(xiàn)下拉式菜單10Message顯示文本,類似label,但能夠自動(dòng)地調(diào)整文本到給定的寬度或比率11Radiobutton單選按鈕,代表一個(gè)變量,可以有多個(gè)值中的一個(gè)。點(diǎn)擊它將為這個(gè)變量設(shè)置值,并且清除與這同一變量相關(guān)的其它radiobuttonGUI71序號(hào)組件名稱組件描述12Scale滑塊,允許通過(guò)滑塊來(lái)設(shè)置一數(shù)字值13Scrollbar滾動(dòng)條,為配合使用canvas,entry,listbox,andtext窗口部件的標(biāo)準(zhǔn)滾動(dòng)條14Text格式化文本顯示。允許用不同樣式和屬性來(lái)顯示和編輯文本。同時(shí)支持內(nèi)嵌圖象和窗口15Toplevel容器,作為一個(gè)單獨(dú)的、最上面的窗口顯示注意:Tkinter只提供界面繪制功能,但是什么都不會(huì)發(fā)生!GUI例3:響應(yīng)鼠標(biāo)事件通過(guò)組件的bind方法關(guān)聯(lián)事件處理函數(shù)創(chuàng)建事件處理函數(shù):組件被觸發(fā)后需要完成的功能綁定組件、事件類型和事件處理函數(shù):
widget.bind(event_type_name,event_handler_name)三要素:哪個(gè)組件需要響應(yīng)事件、響應(yīng)何種類型的事件、事件的處理句柄是誰(shuí)72GUI例3:響應(yīng)鼠標(biāo)事件方法1:通過(guò)組件的bind方法關(guān)聯(lián)事件處理函數(shù)創(chuàng)建組件:獲取組件實(shí)例名創(chuàng)建事件處理函數(shù):組件被觸發(fā)后需要完成的功能綁定組件、事件類型和事件處理函數(shù):
widget.bind(event_type_name,event_handler_name)三要素:哪個(gè)組件需要響應(yīng)事件、響應(yīng)何種類型的事件、事件的處理句柄是誰(shuí)方法2:通過(guò)組件的command屬性關(guān)聯(lián)事件處理函數(shù)創(chuàng)建事件處理函數(shù)創(chuàng)建組件和綁定事件:同時(shí)完成組件實(shí)例名=組件類型(父組件,command=
事件處理函數(shù))注:常用第一種方法,第二種方法不易傳遞參數(shù)73GUI注意:bind調(diào)用的事件響應(yīng)函數(shù)需在被調(diào)用位置之前定義74importtkinter#導(dǎo)入包root=tkinter.Tk()#窗體對(duì)象defbutton1Click(event):#自定義事件處理函數(shù)ifmyButton1["background"]=="green":myButton1["background"]="yellow"else:myButton1["background"]="green"myButton1=tkinter.Button(root)#按鈕對(duì)象myButton1["text"]="Hello,World!"#按鈕名稱屬性myButton1["background"]="green"#按鈕背景屬性myButton1.pack(side=tkinter.RIGHT)#顯示組件myButton1.bind(“<Button-1>”,button1Click)#綁定事件myButton2=tkinter.Button(root)#按鈕對(duì)象myButton2["text"]="Python!"#按鈕名稱屬性myButton2["background"]="red"#按鈕背景屬性myButton2.pack(side=tkinter.LEFT)#顯示組件root.mainloop()#消息循環(huán)GUI例3擴(kuò)展:事件類型<[modifier-]type[-detail]>:modifier和detail是可選項(xiàng)type:事件類型,如鼠標(biāo)事件、鍵盤事件、窗體事件等modifier:用于組合操作,如shift,control等detail:具體的key或鼠標(biāo)位置舉例:<Button-1><Double-Button-1><Shift-Up>75GUIType1——鼠標(biāo)事件Type2——鍵盤事件76<Button-1>:鼠標(biāo)左擊事件<Button-2>:鼠標(biāo)中擊事件<Button-3>:鼠標(biāo)右擊事件<Double-Button-1>:雙擊事件<Triple-Button-1>:三擊事件<B1-Motion>:左鍵移動(dòng)事件<ButtonRelease-1>:左鍵釋放<Key>:所有key事件特殊按鍵事件:<BackSpace><Return><Shift_L><Shift_R>GUIType3——窗體事件77GUI窗體事件78GUImodifierdetail79名稱描述Altalt按鍵Any任意的按鍵Controlcontrol按鍵Double雙擊Lockshiftlock按鍵Shiftshift按鍵Triple三擊類型名稱描述鼠標(biāo)1鼠標(biāo)左鍵2鼠標(biāo)中鍵3鼠標(biāo)右鍵鍵盤key鍵盤對(duì)應(yīng)key鍵GUI例4:響應(yīng)鍵盤事件鍵盤事件和鼠標(biāo)事件相同點(diǎn):同樣需要通過(guò)bind綁定組件、鍵盤事件和事件處理函數(shù)。widget.bind(event_type_name,event_handler_name)鍵盤事件和鼠標(biāo)事件不同點(diǎn):需要獲取組件焦點(diǎn):組件.focus_force()需要采用鍵盤事件:修改event_type_name80GUI81importtkinter#導(dǎo)入包root=tkinter.Tk()#窗體對(duì)象defbutton1Click(event):#自定義事件處理函數(shù)ifmyButton1["background"]=="green":myButton1["background"]="yellow"else:myButton1["background"]="green"myButton1=tkinter.Button(root)#按鈕對(duì)象myButton1["text"]="Hello,World!"#按鈕名稱屬性myButton1["background"]="green"#按鈕背景屬性myButton1.pack(side=tkinter.RIGHT)#顯示組件myButton1.focus_force()#獲取組件焦點(diǎn)myButton1.bind(“<Key-1>”,button1Click)#綁定事件myButton2=tkinter.Button(root)#按鈕對(duì)象myButton2["text"]="Python!"#按鈕名稱屬性myButton2["background"]="red"#按鈕背景屬性myButton2.pack(side=tkinter.LEFT)#顯示組件root.mainloop()#消息循環(huán)GUI例5:簡(jiǎn)易計(jì)算器
用四個(gè)文本框?qū)崿F(xiàn)“+-*\”四則運(yùn)算文本框繪制:Entry組件文本框事件響應(yīng):響應(yīng)鍵盤釋放事件文本框值的獲?。篍ntry組件輸入值的獲取;Entry組件輸出值的獲取操作類型識(shí)別:根據(jù)輸入操作符判斷運(yùn)算類型82GUI83importtkinter#導(dǎo)入包root=tkinter.Tk()#窗體對(duì)象defget_add1(event):globaltext_add1text_add1=add1.get()defget_add2(event):globaltext_add2text_add2=add2.
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024特許加盟合同協(xié)議范本
- 2025年度礦產(chǎn)資源整合采礦權(quán)抵押交易合同樣本3篇
- 2025年度圓通快遞快遞員權(quán)益保障及培訓(xùn)合同3篇
- 2025年度工業(yè)園區(qū)廠房及倉(cāng)儲(chǔ)場(chǎng)地租賃合同范本2篇
- 2025年度物流數(shù)據(jù)分析與挖掘服務(wù)合同4篇
- 2024美容美發(fā)連鎖加盟合同
- 2024裝飾工程承包合同書
- 2025年度物流車輛數(shù)據(jù)信息服務(wù)合同4篇
- 2024版設(shè)備銷售與服務(wù)合同
- 2025年度MCN藝人品牌合作推廣合同3篇
- 2025年河北供水有限責(zé)任公司招聘筆試參考題庫(kù)含答案解析
- Unit3 Sports and fitness Discovering Useful Structures 說(shuō)課稿-2024-2025學(xué)年高中英語(yǔ)人教版(2019)必修第一冊(cè)
- 農(nóng)發(fā)行案防知識(shí)培訓(xùn)課件
- 社區(qū)醫(yī)療抗菌藥物分級(jí)管理方案
- NB/T 11536-2024煤礦帶壓開采底板井下注漿加固改造技術(shù)規(guī)范
- 2024年九年級(jí)上德育工作總結(jié)
- 2024年儲(chǔ)罐呼吸閥項(xiàng)目可行性研究報(bào)告
- 除氧器出水溶解氧不合格的原因有哪些
- 沖擊式機(jī)組水輪機(jī)安裝概述與流程
- 新加坡SM2數(shù)學(xué)試題
- 畢業(yè)論文-水利水電工程質(zhì)量管理
評(píng)論
0/150
提交評(píng)論