版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
單元9網(wǎng)絡(luò)編程與進程控制【任務(wù)9-1】實現(xiàn)客戶端與服務(wù)器之間通信【任務(wù)描述】(1)在PyCharm集成開發(fā)環(huán)境中創(chuàng)建項目Unit09。(2)在項目Unit09創(chuàng)建“9-1server.py”和“9-1client.py”兩個Python程序文件。(3)編寫程序使用socket實現(xiàn)TCP服務(wù)器端與客戶端之間的通信,即客戶端向服務(wù)器發(fā)送文字,服務(wù)器端接到消息后,顯示消息內(nèi)容并且輸入文字返回給客戶端??蛻艚邮盏巾憫?yīng),顯示該文字,然后繼續(xù)向服務(wù)器發(fā)送消息,這樣,就可以實現(xiàn)一個簡易的聊天程序。當(dāng)輸入“exit”時,則退出系統(tǒng),中斷聊天?!救蝿?wù)實施】1.創(chuàng)建PyCharm項目Unit09成功啟動PyCharm后,在指定位置“D:\PycharmProject\”,創(chuàng)建PyCharm項目Unit09。2.創(chuàng)建Python程序文件9-1server.py在PyCharm項目“Unit09”中,新建Python程序文件“9-1server.py”。3.編寫Python程序代碼在新建文件“9-1server.py”的代碼編輯窗口輸入程序代碼。importsocket#導(dǎo)入socket模塊try:host=socket.gethostname()#獲取主機地址port=1818#設(shè)置端口號sock1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創(chuàng)建TCP/IP套接字sock1.bind((host,port))#綁定地址(host,port)到套接字sock1.listen(1)#設(shè)置最多連接數(shù)量print(host,"在監(jiān)聽…")sock=sock1.accept()[0]#被動接受TCP客戶端連接print("連接已經(jīng)建立")info=sock.recv(1024).decode()#接收客戶端數(shù)據(jù)whileTrue:#判斷是否退出ifinfo:print("收到客戶端請求的內(nèi)容:"+info)sendData=input("服務(wù)器端回復(fù)的內(nèi)容:")#發(fā)送消息sock.send(sendData.encode())#發(fā)送TCP數(shù)據(jù)ifsendData=="exit":#如果發(fā)送byebye,則退出breakinfo=sock.recv(1024).decode()#接收客戶端數(shù)據(jù)sock.close()#關(guān)閉客戶端套接字sock1.close()#關(guān)閉服務(wù)器套接字exceptExceptionaserror:print(error)4.創(chuàng)建Python程序文件9-1client.py在PyCharm項目“Unit09”中,新建Python程序文件“9-1client.py”。5.編寫Python程序代碼在新建文件“9-1client.py”的代碼編輯窗口輸入程序代碼。importsocket#導(dǎo)入socket模塊input("按任意鍵開始連接服務(wù)器...")try:sock=socket.socket()#創(chuàng)建TCP/IP套接字host=socket.gethostname()#獲取主機地址port=1818#設(shè)置端口號sock.connect((host,port))#主動初始化TCP服務(wù)器連接print("成功連接服務(wù)器")info=""whileTrue:#判斷是否退出sendData=input("客戶端請求的內(nèi)容:")#輸入內(nèi)容sock.send(sendData.encode())#發(fā)送TCP數(shù)據(jù)ifsendData=="exit":#判斷是否退出breakinfo=sock.recv(1024).decode()#接收服務(wù)器數(shù)據(jù)print("收到服務(wù)器回復(fù)的內(nèi)容:"+info)sock.close()#關(guān)閉套接字exceptExceptionaserror:print(error)單擊工具欄中【保存】按鈕,分別保存“9-1server.py”和“9-1client.py”兩個程序文件。6.運行Python程序運行程序之前,先打開2個Windows命令行窗口,第1個命令行窗口模擬TCP服務(wù)器端,第2個命令行窗口模擬TCP客戶端。在第1個命令行窗口的提示符“>”后輸入命令:pythonD:\PycharmProject\Unit09\9-1server.py,開始運行9-1server.py程序,此時該窗口中會出現(xiàn)“MS-201705281819在監(jiān)聽…”的提示文字。然后在第2個命令行窗口的提示符“>”后輸入命令:pythonD:\PycharmProject\Unit09\9-1client.py,開始運行9-1client.py程序,此時該窗口中出現(xiàn)“按任意鍵開始連接服務(wù)器...”提示文字,按【Enter】鍵或其他任意鍵后第1個命令行窗口出現(xiàn)“連接已經(jīng)建立”的提示文字,第2個命令行窗口出現(xiàn)“成功連接服務(wù)器”的提示文字。在第2個命令行窗口中提示文字“客戶端請求的內(nèi)容:”后輸入“Hi,hello.”,再按【Enter】鍵,此時第1個命令行窗口中會接收到客戶端發(fā)來的數(shù)據(jù),出現(xiàn)“收到客戶端請求的內(nèi)容:Hi,hello.”的內(nèi)容,程序運行時分別在模擬TCP服務(wù)器端和模擬TCP客戶端發(fā)送或收到的信息如表9-3所示。表9-3程序運行時分別在模擬TCP服務(wù)器端和模擬TCP客戶端發(fā)送或收到的信息客戶端收到與發(fā)送的信息服務(wù)器端發(fā)送與收到信息發(fā)送的信息Hi,hello.收到的信息Hi,hello.收到的信息Nicetohearfromyou發(fā)送的信息Nicetohearfromyou發(fā)送的信息Wishesyoutobehappydaily!收到的信息Wishesyoutobehappydaily!收到的信息Thankyou!Happyeveryday發(fā)送的信息Thankyou!Happyeveryday發(fā)送的信息byebye收到的信息byebye收到的信息byebye發(fā)送的信息byebye發(fā)送的信息exit收到的信息exit發(fā)送的信息exit【任務(wù)9-1】模擬TCP服務(wù)器端的命令行窗口中出現(xiàn)的信息如下所示,模擬TCP客戶端的命令行窗口中出現(xiàn)的信息如下所示。圖9-9【任務(wù)9-1】模擬TCP服務(wù)器端的命令行窗口圖9-10【任務(wù)9-1】模擬TCP客戶端的命令行窗口【任務(wù)9-2】TCP服務(wù)器與客戶端之間傳輸字符串?dāng)?shù)據(jù)【任務(wù)描述】(1)在項目Unit09創(chuàng)建“9-2server.py”和“9-2client.py”兩個Python程序文件。(2)編寫程序?qū)崿F(xiàn)服務(wù)器與客戶端之間傳輸字符串?dāng)?shù)據(jù),即客戶端連接服務(wù)器后向服務(wù)器發(fā)送一個字符串,服務(wù)器接收到字符串后再次返回這個字符串給客戶端?!救蝿?wù)實施】1.創(chuàng)建Python程序文件9-2server.py在PyCharm項目“Unit09”中,新建Python程序文件“9-2server.py”。2.編寫Python程序代碼在新建文件“9-2server.py”的代碼編輯窗口輸入程序代碼。importstructimportsocketdefreadString(socket):size=struct.calcsize("@i")info=socket.recv(size)unp=struct.unpack("@i",info)[0]data=socket.recv(unp)returndata.decode("utf-8")defwriteString(socket,str):data=str.encode("utf-8")size=len(data)pac=struct.pack("@i",size)socket.send(pac)socket.send(data)try:sock=socket.socket()host=socket.gethostname()port=6656sock.bind((host,port))sock.listen()print(host,"在監(jiān)聽...")acce=sock.accept()[0]print("客戶端連接已建立")data=readString(acce)print(data)writeString(acce,data)acce.close()sock.close()exceptExceptionaserror:print(error)3.創(chuàng)建Python程序文件程序9-2client.py在PyCharm項目“Unit09”中,新建Python程序文件“9-2client.py”。4.編寫Python程序代碼在新建文件“程序9-2client.py”的代碼編輯窗口輸入程序代碼。importstructimportsocketdefwriteString(socket,str):data=str.encode("utf-8")size=len(data)pac=struct.pack("@i",size)socket.send(pac)socket.send(data)defreadString(socket):size=struct.calcsize("@i")info=socket.recv(size)unp=struct.unpack("@i",info)[0]data=socket.recv(unp)returndata.decode("utf-8")try:str="Goodluck."sock=socket.socket()host=socket.gethostname()port=6656sock.connect((host,port))print("成功連接服務(wù)器")writeString(sock,str)data=readString(sock)print(data)sock.close()exceptExceptionaserror:print(error)單擊工具欄中【保存】按鈕,分別保存“9-2server.py”和“9-2client.py”兩個程序文件。3.運行Python程序運行程序之前,先打開2個Windows命令行窗口,第1個命令行窗口模擬TCP服務(wù)器端,第2個命令行窗口模擬TCP客戶端。在第1個命令行窗口的提示符“>”后輸入命令:pythonD:\PycharmProject\Unit09\9-2server.py,開始運行9-2server.py程序,此時該窗口中會出現(xiàn)“MS-201705281819在監(jiān)聽…”的提示文字,服務(wù)器處于監(jiān)聽狀態(tài)。然后在第2個命令行窗口的提示符“>”后輸入命令:pythonD:\PycharmProject\Unit09\9-2client.py,開始運行9-2client.py程序,客戶端將字符串“Goodluck.”發(fā)送給服務(wù)器,服務(wù)器收到這個字符串,第1個命令行窗口出現(xiàn)“客戶端連接已經(jīng)建立”的提示文字和傳輸?shù)淖址癎oodluck.”。服務(wù)器再次把字符串“Goodluck.”返回給客戶端,客戶端又收到該字符串,第2個命令行窗口出現(xiàn)“成功連接服務(wù)器”的提示文字和“Goodluck.”。通信結(jié)束時,服務(wù)器端和客戶端都關(guān)閉套接字?!救蝿?wù)9-2】模擬TCP服務(wù)器端的命令行窗口中出現(xiàn)的信息如下所示,模擬TCP客戶端的命令行窗口中出現(xiàn)的信息如下所示。圖9-11【任務(wù)9-2】模擬TCP服務(wù)器端的命令行窗口中出現(xiàn)的信息圖9-12【任務(wù)9-2】模擬TCP客戶端的命令行窗口中出現(xiàn)的信息【任務(wù)9-3】建立UDP通信獲取客戶購物數(shù)量【任務(wù)描述】(1)在項目Unit09創(chuàng)建“9-3server.py”和“9-3client.py”兩個Python程序文件。(2)編寫程序建立UDP通信獲取客戶購物數(shù)量,即在客戶端輸入購物數(shù)量,然后發(fā)送給服務(wù)器,服務(wù)器端收到數(shù)據(jù)后,再發(fā)送給客戶端輸出。【任務(wù)實施】在PyCharm項目Unit09中創(chuàng)建Python程序文件程序9-3server.py。在程序文件程序9-3server.py中編寫程序代碼,實現(xiàn)所需功能。importsocket#導(dǎo)入Socket模塊sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#創(chuàng)建UDP套接字sock.bind(("",6688))#綁定地址(host,port)到套接字print("綁定UDP到6688端口")data,addr=sock.recvfrom(1024)#接收數(shù)據(jù)sendData="購買數(shù)量為:"+str(data)print(sendData)print("Receivedfrom:",addr)sock.sendto(sendData.encode(),addr)#發(fā)送給客戶端sock.close()#關(guān)閉服務(wù)器端套接字程序9-3server.py中使用socket.socket()方法創(chuàng)建套接字,其中參數(shù)設(shè)置為AF_INET和SOCK_DGRAM,表明創(chuàng)建的是UDP套接字,recvfrom()方法生成的data數(shù)據(jù)類型是byte類型。使用sendto()方法發(fā)送數(shù)據(jù)時,發(fā)送的數(shù)據(jù)必須是byte類型,所以需要使用encode()函數(shù)將字符串轉(zhuǎn)換為byte類型。在PyCharm項目Unit09中創(chuàng)建Python程序文件程序9-3client.py。在程序文件程序9-3client.py中編寫程序代碼,實現(xiàn)所需功能。importsocket#導(dǎo)入Socket模塊sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#創(chuàng)建UDP套接字data=input("請輸入購買數(shù)量:")sock.sendto(data.encode(),("",6688))#發(fā)送數(shù)據(jù)print(sock.recv(1024).decode())#打印接收數(shù)據(jù):sock.close()#關(guān)閉套接字由于接收的數(shù)據(jù)和發(fā)送的數(shù)據(jù)其類型都是byte,程序9-3client.py的代碼中發(fā)送數(shù)據(jù)時,使用encode()函數(shù)將字符串轉(zhuǎn)換為byte類型。而輸出數(shù)據(jù)時,使用decode()函數(shù)將byte類型的數(shù)據(jù)轉(zhuǎn)換為字符串,方便用戶閱讀。運行程序之前,先打開2個Windows命令行窗口,第1個命令行窗口模擬UDP服務(wù)器端,第2個命令行窗口模擬UDP客戶端。在第1個命令行窗口的提示符“>”后輸入命令:pythonD:\PycharmProject\Unit09\9-3server.py,開始運行9-3server.py程序,此時該窗口中會出現(xiàn)“綁定UDP到6688端口”的文字。然后在第2個命令行窗口的提示符“>”后輸入命令:pythonD:\PycharmProject\Unit09\9-3client.py,開始運行9-3client.py程序,此時該窗口中出現(xiàn)“請輸入購買數(shù)量:”提示文字,接著輸入購買的數(shù)量,這里輸入“5”,然后按【Enter】鍵,此時第1個命令行窗口出現(xiàn)“購買數(shù)量為:b'5'”和“Receivedfrom:('',50003)”兩行提示文字,第2個命令行窗口出現(xiàn)“購買數(shù)量為:b'5'”的提示文字。【任務(wù)9-3】模擬UDP服務(wù)器端的命令行窗口中出現(xiàn)的信息如下所示,模擬UDP客戶端的命令行窗口中出現(xiàn)的信息如下所示。圖9-14【任務(wù)9-3】模擬UDP服務(wù)器端的命令行窗口圖9-15【任務(wù)9-3】模擬UDP客戶端的命令行窗口單元10基于GUI框架的圖形界面設(shè)計與網(wǎng)絡(luò)爬蟲應(yīng)用【任務(wù)10-1】使用wxPython框架結(jié)合sqlite3數(shù)據(jù)庫設(shè)計圖形用戶登錄界面【任務(wù)描述】(1)在PyCharm集成開發(fā)環(huán)境中創(chuàng)建項目Unit10。(2)在項目Unit10創(chuàng)建Python程序文件“10-1Init.py”和“10-1.py”。(3)使用wxPython框架結(jié)合sqlite3數(shù)據(jù)庫設(shè)計圖形用戶登錄界面,實現(xiàn)用戶登錄功能。即分別為【確定】和【取消】按鈕添加單擊事件,當(dāng)用戶輸入用戶名和密碼后,單擊【確定】按鈕,首先判斷用戶名或密碼是否為空,如果為空則彈出“提示信息對話框”,顯示“用戶名或密碼不能為空”的信息;如果輸入的用戶名和密碼正確,則彈出“提示信息對話框”顯示“登錄成功”,在“提示信息對話框”中單擊【確認(rèn)】按鈕后,打開【顯示圖書數(shù)據(jù)】窗口;否則出現(xiàn)“用戶名和密碼不匹配”的信息。當(dāng)單擊【取消】按鈕時,清空用戶輸入的用戶名和密碼,關(guān)閉登錄窗口。【任務(wù)實施】1.創(chuàng)建PyCharm項目Unit10成功啟動PyCharm后,在指定位置“D:\PycharmProject\”,創(chuàng)建PyCharm項目Unit10。2.創(chuàng)建Python程序文件10-1Init.py在PyCharm項目“Unit10”中,新建Python程序文件“10-1Init.py”,在新建文件“10-1Init.py”的代碼編輯窗口輸入程序代碼。importsqlite3userData=[(1,"2020011","admin","666"),(2,"2020012","better","888"),(3,"2020013","向前","123456"),(4,"2020014","尋找","123"),(5,"2020015","向好漢","1456")]sqlCreateTable="""CreateTableifnotexists用戶表(用戶IDint(10)primarykey,用戶編號varchar(10),用戶名稱varchar(30),密碼varchar(20))"""definitDb():#數(shù)據(jù)庫文件是User.db,如果文件不存在,會自動在當(dāng)前目錄創(chuàng)建conn=sqlite3.connect("User.db")#創(chuàng)建一個游標(biāo)對象Cursorcursor=conn.cursor()returnconn,cursordefgetInsertSql():#SQL插入語句strInsert="""insertinto用戶表(用戶ID,用戶編號,用戶名稱,密碼)values(?,?,?,?)"""returnstrInsertconn,cursor=initDb()cursor.execute(sqlCreateTable)foriteminuserData:cursor.execute(getInsertSql(),(item[0],item[1],item[2],item[3]))mit()#關(guān)閉游標(biāo)cursor.close()#關(guān)閉Connectionconn.close()程序10-1Init.py中的主要功能是:創(chuàng)建sqlite3數(shù)據(jù)庫“User.db”,在該數(shù)據(jù)庫中新建數(shù)據(jù)表“用戶表”,然后數(shù)據(jù)表中添加5條用戶記錄。3.創(chuàng)建Python程序文件10-1.py在PyCharm項目“Unit10”中,新建Python程序文件“10-1.py”,在新建文件“10-1.py”的代碼編輯窗口輸入程序代碼,代碼實現(xiàn)創(chuàng)建基于父類wx.Frame的窗口類LoginWindow,定義LoginWindow類的__init__()方法,在窗口中添加面板和多個控件,使用wx.BoxSizer對控件進行合理布局,并綁定事件。LoginWindow類的__init__()方法的代碼如下所示。classLoginWindow(wx.Frame):def__init__(self,parent,id):wx.Frame.__init__(self,parent,id,title="用戶登錄",size=(300,190))#創(chuàng)建面板panel=wx.Panel(self)#創(chuàng)建“確定”和“取消”按鈕,并綁定事件self.btnConfirm=wx.Button(panel,label="確定",pos=(50,110))self.btnConfirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)self.btnCancel=wx.Button(panel,label="取消",pos=(150,110))self.btnCancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)#創(chuàng)建文本,左對齊self.title=wx.StaticText(panel,label="請輸入用戶名和密碼")self.lblUser=wx.StaticText(panel,label="用戶名:")self.txtUser=wx.TextCtrl(panel,style=wx.TE_LEFT)self.lblPassword=wx.StaticText(panel,label="密碼:")self.txtPassword=wx.TextCtrl(panel,style=wx.TE_PASSWORD)#添加容器,容器中控件橫向排列hsizerUser=wx.BoxSizer(wx.HORIZONTAL)hsizerUser.Add(self.lblUser,proportion=0,flag=wx.ALL,border=5)hsizerUser.Add(self.txtUser,proportion=1,flag=wx.ALL,border=5)hsizerPassword=wx.BoxSizer(wx.HORIZONTAL)hsizerPassword.Add(self.lblPassword,proportion=0,flag=wx.ALL,border=5)hsizerPassword.Add(self.txtPassword,proportion=1,flag=wx.ALL,border=5)#添加容器,容器中控件縱向排列vsizer=wx.BoxSizer(wx.VERTICAL)vsizer.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=5)vsizer.Add(hsizerUser,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=15)vsizer.Add(hsizerPassword,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=15)panel.SetSizer(vsizer)LoginWindow類的__init__()方法中,分別使用Bind()函數(shù)為btnConfirm、btnCancel綁定了單擊事件,單擊【確定】按鈕時,執(zhí)行OnclickSubmit()方法判斷用戶名和密碼是否正確,然后使用wx.MessageBox()方法彈出提示信息對話框。單擊【取消】按鈕時,執(zhí)行OnclickCancel()方法清空輸入的用戶名和密碼,關(guān)閉用戶登錄窗口。LoginWindow類的OnclickSubmit()方法和OnclickCancel()方法的代碼如下所示。defOnclickSubmit(self,event):"""單擊確定按鈕,執(zhí)行方法"""message=""username=self.txtUser.GetValue()#獲取輸入的用戶名password=self.txtPassword.GetValue()#獲取輸入的密碼num=getUserInfo(username,password)ifusername==""orpassword=="":#判斷用戶名或密碼是否為空message="用戶名或密碼不能為空"wx.MessageBox(message)#彈出提示框elifnum>=0:#用戶名和密碼正確message="登錄成功"wx.MessageBox(message)#彈出提示框loginWin.Hide()dataWin.Show()else:message="用戶名和密碼不匹配"#用戶名或密碼錯誤self.txtUser.SetValue("")#清空輸入的用戶名self.txtPassword.SetValue("")#清空輸入的密碼wx.MessageBox(message)#彈出提示框defOnclickCancel(self,event):"""單擊取消按鈕,執(zhí)行方法"""self.txtUser.SetValue("")#清空輸入的用戶名self.txtPassword.SetValue("")#清空輸入的密碼loginWin.Hide()自定義函數(shù)initDb()用于連接sqlite3數(shù)據(jù)庫,且返回連接對象和游標(biāo)對象。自定義函數(shù)getUserInfo()用于從數(shù)據(jù)表“用戶表”中獲取符合指定條件的數(shù)據(jù),判斷用戶名和密碼在數(shù)據(jù)表“用戶表”是否存在,代碼如下所示。definitDb():#數(shù)據(jù)庫文件是"User.db",如果文件不存在,會自動在當(dāng)前文件創(chuàng)建conn=sqlite3.connect("User.db")#創(chuàng)建一個游標(biāo)對象Cursorcursor=conn.cursor()returnconn,cursordefgetUserInfo(name,password):conn,cursor=initDb()#SQL查詢數(shù)據(jù)語句strSelect="select用戶名稱,密碼from用戶表where用戶名稱=?and密碼=?"cursor.execute(strSelect,(name,password))rows=cursor.fetchall()n=len(rows)#關(guān)閉游標(biāo)cursor.close()#關(guān)閉Connectionconn.close()returnn程序10-2.py的主體程序代碼如下:if__name__=="__main__":app=wx.App()loginWin=LoginWindow(parent=None,id=-1)loginWin.Show()#顯示窗口dataWin=wx.Frame(parent=None,title="顯示圖書數(shù)據(jù)")app.MainLoop()#調(diào)用主循環(huán)方法單擊工具欄中【保存】按鈕,保存程序文件“10-1Init.py”和“10-1.py”。4.運行Python程序在PyCharm主窗口選擇【Run】菜單,在彈出的下拉菜單中選擇【Run】菜單項。在彈出的【Run】對話框中選擇“10-1Init”選項,程序“10-1Init”開始運行,完成sqlite3數(shù)據(jù)庫“User.db”的創(chuàng)建,在該數(shù)據(jù)庫中完成數(shù)據(jù)表“用戶表”的創(chuàng)建,然后數(shù)據(jù)表中添加5條用戶記錄。然后,運行程序“10-2.py”,程序10-2.py的運行結(jié)果如圖10-5所示,顯示【用戶登錄】窗口。圖10-5【用戶登錄】窗口初始運行狀態(tài)分別輸入正確的用戶名和密碼后,例如輸入用戶名“admin”,輸入密碼為“666”,如圖10-6所示。然后單擊【確定】按鈕,彈出“提示信息對話框”顯示“登錄成功”,如圖10-7所示。在“提示信息對話框”中單擊【確認(rèn)】按鈕后,打開【顯示圖書數(shù)據(jù)】窗口,如圖10-8所示。圖10-6在【用戶登錄】窗口中輸入用戶名與密碼圖10-7“登錄成功”的提示信息對話框圖10-8【顯示圖書數(shù)據(jù)】窗口【任務(wù)10-2】在窗體的QListView控件中顯示銷量前10名的圖書名稱列表【任務(wù)描述】(1)在項目Unit10創(chuàng)建Python程序文件“mysql10.py”,該文件定義MySQLClass類,該類中定義方法connectionSql(),該方法用于連接數(shù)據(jù)庫;定義方法closeSql(),用于關(guān)閉數(shù)據(jù)庫;定義方法query_top10_bookName(),該方法用于獲取數(shù)據(jù)表“salesRank”中銷量榜前10名的書名。(2)創(chuàng)建一個窗口,在該窗口添加一個QListView控件,將數(shù)據(jù)表“salesRank”中銷量榜前10名的書名添加到QListView控件,并輸出這些圖書名稱?!救蝿?wù)實施】1.創(chuàng)建Python程序文件mysql10.py在PyCharm項目“Unit10”中,新建Python程序文件“mysql10.py”,在新建文件“mysql10.py”的代碼編輯窗口輸入程序代碼。classMySQLClass(object):#連接數(shù)據(jù)庫defconnectionSql(self):#連接數(shù)據(jù)庫self.db=pymysql.connect(host="localhost",user="root",password="123456",db="eCommerce",port=3306,charset="utf8")returnself.db#關(guān)閉數(shù)據(jù)庫defcloseSql(self):self.db.close()#獲取銷量榜前10名的書名defquery_top10_bookName(self,cur):name=[]#書名列表querySql="selectbookNamefromsalesRankwhereid<=10"cur.execute(querySql)#執(zhí)行sql語句results=cur.fetchall()#獲取查詢的所有記錄i=1#定義排名變量forrowinresults:i=str(i)#轉(zhuǎn)換變量類型為字符串類型name.append('第'+i+'名:'+row[0])#將排名與圖書名稱添加至列表中i=int(i)#由于字符串類型無法進行計算,所以轉(zhuǎn)換為int類型i+=1#改變排名returnname#將保存書名的列表返回2.創(chuàng)建Python程序文件10-2.py在PyCharm項目“Unit10”中,新建Python程序文件“10-2.py”,在新建文件“10-2.py”的代碼編輯窗口輸入程序代碼。importsysfromPyQt5importQtCorefromPyQt5.QtWidgetsimportQApplication,QWidget,QMainWindow,QVBoxLayout,QListViewfromPyQt5.QtGuiimportQIcon,QFontfrommysqlimportMySQL#導(dǎo)入自定義數(shù)據(jù)庫文件classMainWindow(QMainWindow):def__init__(self,parent=None):super(MainWindow,self).__init__(parent)self.initUi()self.setListView()definitUi(self):#設(shè)置窗口屬性self.resize(580,260)self.setWindowTitle("圖書銷量前十名排行榜")self.setWindowIcon(QIcon("favicon.ico"))defsetListView(self):#銷量前十名圖書名稱的列表list=mysql.query_top10_bookName(cur)model=QtCore.QStringListModel()#創(chuàng)建字符串列表模式model.setStringList(list)#設(shè)置字符串列表font=QFont()font.setPointSize(11)self.listView=QListView()self.listView.setWordWrap(True)#自動換行self.listView.setFont(font)#設(shè)置字體大小layout=QVBoxLayout()layout.addWidget(self.listView)mainFrame=QWidget()self.setCentralWidget(mainFrame)mainFrame.setLayout(layout)self.listView.setModel(model)#設(shè)置模式mysql.closeSql()#關(guān)閉數(shù)據(jù)庫if__name__=="__main__":#創(chuàng)建自定義數(shù)據(jù)庫對象mysql=MySQL()#連接數(shù)據(jù)庫sql=mysql.connectionSql()#創(chuàng)建游標(biāo)cur=sql.cursor()app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec_())單擊工具欄中【保存】按鈕,保存程序文件“mysql10.py”和“10-2.py”。3.運行Python程序在PyCharm主窗口選擇【Run】菜單,在彈出的下拉菜單中選擇【Run】菜單項。在彈出的【Run】對話框中選擇“10-2”選項,程序“10-2.py”開始運行。程序10-2.py的運行結(jié)果如圖10-10所示。圖10-10程序10-2.py的運行結(jié)果【任務(wù)10-3】窗體中以表格方式展示計算機與互聯(lián)網(wǎng)圖書銷量排行榜【任務(wù)描述】(1)在項目Unit07創(chuàng)建Python程序文件10-3.py。(2)在【任務(wù)10-2】所定義MySQLClass類中新增一個方法query_top100_rankings(),該方法用于獲取排行榜中排名前100位圖書的排名、圖書名稱、定價、京東價、出版社等信息。(3)創(chuàng)建一個窗口,在該窗口添加一個QTableWidget控件,將數(shù)據(jù)表“salesRank”中排行前100位的圖書信息添加到QTableWidget控件,并以表格方式輸出這些圖書的排名、圖書名稱、定價、京東價、出版社等字段的信息?!救蝿?wù)實施】在PyCharm項目Unit10中打開程序文件“mysql10.py”,在類MySQLClass類中新增一個方法query_top100_rankings(),該方法的代碼如下所示。classMySQLClass(object):#獲取排行前100名的圖書信息defquery_top100_rankings(self,cur,table):querySql="selectID,bookName,dingPrice,jdPrice,publisherfrom{table}".format(table=table)cur.execute(querySql)#執(zhí)行sql語句results=cur.fetchall()#獲取查詢的所有記錄row=len(results)#獲取信息條數(shù),作為表格的行column=len(results[0])#獲取字段數(shù)量,作為表格的列returnrow,column,results#返回信息行與信息列(字段對應(yīng)的信息)在PyCharm項目Unit10中創(chuàng)建Python程序文件10-3.py。在程序文件10-3.py中編寫程序代碼,實現(xiàn)所需功能。importsysfromPyQt5importQtCorefromPyQt5.QtWidgetsimportQApplication,QWidget,QMainWindow,QVBoxLayout,QTableWidget,\QHeaderView,QTableWidgetItem,QAbstractItemViewfromPyQt5.QtGuiimportQIcon,QFontimportmysql
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《單證管理流程》課件
- 《少兒青春期教育》課件
- 單位管理制度集粹選集人員管理
- 《電化學(xué)局部腐蝕》課件
- 單位管理制度合并匯編【員工管理篇】
- 單位管理制度分享合集職工管理篇
- 單位管理制度范例匯編員工管理篇
- 單位管理制度呈現(xiàn)匯編【人力資源管理篇】十篇
- 單位管理制度呈現(xiàn)大全員工管理篇十篇
- 2024班級安全教育工作總結(jié)范文(30篇)
- 管轄權(quán)異議仲裁申請書
- (完整版)中考英語作文必備好詞好句
- T-CERDS 3-2022 企業(yè)ESG評價體系
- 落實國家組織藥品集中采購使用檢測和應(yīng)急預(yù)案
- 報價經(jīng)理崗位職責(zé)
- 汝州某燃煤熱電廠施工組織設(shè)計
- 豬場配懷工作安排方案設(shè)計
- 《廣東省普通高中學(xué)生檔案》模板
- GB/T 2-2016緊固件外螺紋零件末端
- GB/T 12467.5-2009金屬材料熔焊質(zhì)量要求第5部分:滿足質(zhì)量要求應(yīng)依據(jù)的標(biāo)準(zhǔn)文件
- GB 17740-1999地震震級的規(guī)定
評論
0/150
提交評論