版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
單元10基于GUI框架的圖形界面設計與網(wǎng)絡爬蟲應用【任務10-1】使用wxPython框架結合sqlite3數(shù)據(jù)庫設計圖形用戶登錄界面【任務描述】(1)在PyCharm集成開發(fā)環(huán)境中創(chuàng)建項目Unit10。(2)在項目Unit10創(chuàng)建Python程序文件“10-1Init.py”和“10-1.py”。(3)使用wxPython框架結合sqlite3數(shù)據(jù)庫設計圖形用戶登錄界面,實現(xiàn)用戶登錄功能。即分別為【確定】和【取消】按鈕添加單擊事件,當用戶輸入用戶名和密碼后,單擊【確定】按鈕,首先判斷用戶名或密碼是否為空,如果為空則彈出“提示信息對話框”,顯示“用戶名或密碼不能為空”的信息;如果輸入的用戶名和密碼正確,則彈出“提示信息對話框”顯示“登錄成功”,在“提示信息對話框”中單擊【確認】按鈕后,打開【顯示圖書數(shù)據(jù)】窗口;否則出現(xiàn)“用戶名和密碼不匹配”的信息。當單擊【取消】按鈕時,清空用戶輸入的用戶名和密碼,關閉登錄窗口。【任務實施】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,如果文件不存在,會自動在當前目錄創(chuàng)建conn=sqlite3.connect("User.db")#創(chuàng)建一個游標對象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()#關閉游標cursor.close()#關閉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()方法清空輸入的用戶名和密碼,關閉用戶登錄窗口。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ù)庫,且返回連接對象和游標對象。自定義函數(shù)getUserInfo()用于從數(shù)據(jù)表“用戶表”中獲取符合指定條件的數(shù)據(jù),判斷用戶名和密碼在數(shù)據(jù)表“用戶表”是否存在,代碼如下所示。definitDb():#數(shù)據(jù)庫文件是"User.db",如果文件不存在,會自動在當前文件創(chuàng)建conn=sqlite3.connect("User.db")#創(chuàng)建一個游標對象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)#關閉游標cursor.close()#關閉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的運行結果如圖10-5所示,顯示【用戶登錄】窗口。圖10-5【用戶登錄】窗口初始運行狀態(tài)分別輸入正確的用戶名和密碼后,例如輸入用戶名“admin”,輸入密碼為“666”,如圖10-6所示。然后單擊【確定】按鈕,彈出“提示信息對話框”顯示“登錄成功”,如圖10-7所示。在“提示信息對話框”中單擊【確認】按鈕后,打開【顯示圖書數(shù)據(jù)】窗口,如圖10-8所示。圖10-6在【用戶登錄】窗口中輸入用戶名與密碼圖10-7“登錄成功”的提示信息對話框圖10-8【顯示圖書數(shù)據(jù)】窗口【任務10-2】在窗體的QListView控件中顯示銷量前10名的圖書名稱列表【任務描述】(1)在項目Unit10創(chuàng)建Python程序文件“mysql10.py”,該文件定義MySQLClass類,該類中定義方法connectionSql(),該方法用于連接數(shù)據(jù)庫;定義方法closeSql(),用于關閉數(shù)據(jù)庫;定義方法query_top10_bookName(),該方法用于獲取數(shù)據(jù)表“salesRank”中銷量榜前10名的書名。(2)創(chuàng)建一個窗口,在該窗口添加一個QListView控件,將數(shù)據(jù)表“salesRank”中銷量榜前10名的書名添加到QListView控件,并輸出這些圖書名稱?!救蝿諏嵤?.創(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#關閉數(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)#轉換變量類型為字符串類型name.append('第'+i+'名:'+row[0])#將排名與圖書名稱添加至列表中i=int(i)#由于字符串類型無法進行計算,所以轉換為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#導入自定義數(shù)據(jù)庫文件classMainWindow(QMainWindow):def__init__(self,parent=None):super(MainWindow,self).__init__(parent)self.initUi()self.setListView()definitUi(self):#設置窗口屬性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)#設置字符串列表font=QFont()font.setPointSize(11)self.listView=QListView()self.listView.setWordWrap(True)#自動換行self.listView.setFont(font)#設置字體大小layout=QVBoxLayout()layout.addWidget(self.listView)mainFrame=QWidget()self.setCentralWidget(mainFrame)mainFrame.setLayout(layout)self.listView.setModel(model)#設置模式mysql.closeSql()#關閉數(shù)據(jù)庫if__name__=="__main__":#創(chuàng)建自定義數(shù)據(jù)庫對象mysql=MySQL()#連接數(shù)據(jù)庫sql=mysql.connectionSql()#創(chuàng)建游標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的運行結果如圖10-10所示。圖10-10程序10-2.py的運行結果【任務10-3】窗體中以表格方式展示計算機與互聯(lián)網(wǎng)圖書銷量排行榜【任務描述】(1)在項目Unit07創(chuàng)建Python程序文件10-3.py。(2)在【任務10-2】所定義MySQLClass類中新增一個方法query_top100_rankings(),該方法用于獲取排行榜中排名前100位圖書的排名、圖書名稱、定價、京東價、出版社等信息。(3)創(chuàng)建一個窗口,在該窗口添加一個QTableWidget控件,將數(shù)據(jù)表“salesRank”中排行前100位的圖書信息添加到QTableWidget控件,并以表格方式輸出這些圖書的排名、圖書名稱、定價、京東價、出版社等字段的信息?!救蝿諏嵤吭赑yCharm項目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#返回信息行與信息列(字段對應的信息)在PyCharm項目Unit10中創(chuàng)建Python程序文件10-3.py。在程序文件10-3.py中編寫程序代碼,實現(xiàn)所需功能。importsysfromPyQt5importQtCorefromPyQt5.QtWidgetsimportQApplication,QWidget,QMainWindow,QVBoxLayout,QTableWidget,\QHeaderView,QTableWidgetItem,QAbstractItemViewfromPyQt5.QtGuiimportQIcon,QFontimportmysql10#導入自定義數(shù)據(jù)庫文件importchartclassMainWindow(QMainWindow):def__init__(self,parent=None):super(MainWindow,self).__init__(parent)self.initUi()self.setListView()definitUi(self):#設置窗口屬性self.resize(680,260)self.setWindowTitle("計算機與互聯(lián)網(wǎng)圖書銷量排行榜")self.setWindowIcon(QIcon("favicon.ico"))defsetListView(self):#獲取銷量排行前100名數(shù)據(jù)信息row,column,results=mysql.query_top100_rankings(cur,"salesRank")#設置表格內(nèi)容文字大小font=QFont()font.setPointSize(11)self.tableWidget=QTableWidget()self.tableWidget.verticalHeader().setHidden(True)#隱藏行號self.tableWidget.setRowCount(row)#根據(jù)數(shù)據(jù)庫內(nèi)容設置表格行
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024網(wǎng)絡安全防護技術合同
- 二零二五年度綠色環(huán)保安置房交易合同范本3篇
- 2025年度能源項目居間合作合同范本3篇
- 2025年房屋交換與回遷協(xié)議3篇
- 2024版中外合資企業(yè)運營管理合同書版B版
- 2024版政維護合同范本
- 中信證券2024年證券交易服務協(xié)議版A版
- 二零二五年度機場擴建項目吊車租賃合同及吊機操作資質要求3篇
- 事業(yè)單位2024版臨時聘用人員協(xié)議樣本版B版
- 二零二五年度專業(yè)攝影棚場地租賃服務協(xié)議2篇
- 四川省2024年中考數(shù)學試卷十七套合卷【附答案】
- 家用電子產(chǎn)品維修工(中級)職業(yè)技能鑒定考試題庫(含答案)
- 無脊椎動物課件-2024-2025學年人教版生物七年級上冊
- 2024年銀發(fā)健康經(jīng)濟趨勢與展望報告:新老人、新需求、新生態(tài)-AgeClub
- 2024年江西省“振興杯”家務服務員競賽考試題庫(含答案)
- 吉林省2024年中考物理試題(含答案)
- 長鏈氯化石蠟
- 小學六年級數(shù)學解方程計算題
- 春節(jié)英語介紹SpringFestival(課件)新思維小學英語5A
- 進度控制流程圖
- 【閱讀提升】部編版語文五年級下冊第四單元閱讀要素解析 類文閱讀課外閱讀過關(含答案)
評論
0/150
提交評論