Python程序設計基礎與實戰(zhàn)課件_第1頁
Python程序設計基礎與實戰(zhàn)課件_第2頁
Python程序設計基礎與實戰(zhàn)課件_第3頁
Python程序設計基礎與實戰(zhàn)課件_第4頁
Python程序設計基礎與實戰(zhàn)課件_第5頁
已閱讀5頁,還剩122頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第12章PyQt6實現“援心”心理測試系統實戰(zhàn)需求分析數據庫設計PyQt6GUI界面設計系統總體設計系統詳細設計PyInstaller打包程序熟悉項目的設計流程掌握面向對象程序設計方法熟悉PyQt6模塊中控件的基本使用方法熟悉SQLite數據庫的基本使用方法12.1需求分析12.1需求分析“援心”是一款心理測試系統,學生在系統中進行抑郁癥自測,了解自己的心理狀態(tài),如果測試結果是有抑郁傾向的,則可以選擇心理教師進行輔導。心理教師對選擇自己的學生進行心理輔導,并提出咨詢建議。打開系統時,出現登錄界面,用戶通過用戶名和密碼進行登錄。如果用戶是管理員,則進入用戶管理界面,管理員可以對系統中的用戶進行管理,添加、編輯或者刪除用戶。如果用戶是學生,則進入心理自測界面,學生可以進行心理測試,選擇心理輔導教師,查看自己已測的記錄,還可以修改密碼。如果用戶是教師,則進入心理輔導界面,可以對選擇自己的學生進行心理輔導,填寫咨詢建議,也可以修改密碼。12.1需求分析系統的功能列表12.2數據庫設計SQLite數據庫簡介SQLite數據庫的基本語法SQLite數據庫的基本操作項目數據庫設計使用Python操作SQLite數據庫12.2數據庫設計12.2.1SQLite數據庫簡介數據庫是長期存儲在計算機內有組織、可共享的大量數據的集合,關系型數據庫包括SQLite、MicrosoftAccess、MYSQL等,非關系型數據庫(一般指NoSQL)包括Redis、AmazonDynamoDB等。其中SQLite是輕量級、基于磁盤文件的數據庫管理系統,它無需在系統中進行配置,自給自足,不需要任何外部的依賴,而且每個數據庫完全存儲在單個跨平臺的磁盤文件中。由于SQLite的以上特點,本項目選用它進行數據管理。12.2數據庫設計12.2.1SQLite數據庫簡介數據庫的可視化展示會運用數據庫管理工具Navicat。使用Navicat創(chuàng)建一個SQLite數據庫mental_test.db。12.2數據庫設計12.2.2SQLite數據庫的基本語法SQLite數據庫中的語句不區(qū)分大小寫,GLOB和glob除外,因為它們有不同的含義。SQLite數據庫的單行注釋以“--”為標志,多行注釋以“/*”開始,以“*/”為終止,語句之間以英文分號“;”作為結束標志。存儲在SQLite數據庫中的值,可以分為5個存儲類。存儲類說明NULL存儲一個NULL值INTEGER存儲一個帶符號的整數REAL存儲一個浮點值TEXT存儲一個文本字符串,編碼格式為UTF-8、UTF-16BE或UTF-16LEBLOB存儲一個blob數據,根據它的輸入進行存儲SQLite中沒有單獨存儲日期或者時間的存儲類,可以將日期和時間存儲為TEXT類型,存儲格式為“YYYY-MM-DDHH:MM:SS.SSS”12.2數據庫設計12.2.3SQLite數據庫的基本操作-創(chuàng)建表CREATETABLEdatabase_name.table_name( column1datatypePRIMARYKEY(oneormorecolumns), column2datatype, column3datatype, ..... columnNdatatype,);通過CREATETABLE語句可以創(chuàng)建表database_name為數據庫名稱,如果已經指定了,則可以省略。table_name表示新表的名稱,columnN表示列名,datatype表示數據類型,PRIMARYKEY表示主鍵,唯一表示數據庫表中的每條記錄,其所約束的列中的值必須唯一且不能為NULL。12.2數據庫設計12.2.3SQLite數據庫的基本操作-創(chuàng)建表創(chuàng)建一個用戶表user,包含列id(用戶名)、password(密碼)、role(角色),其中id作為主鍵。CREATETABLEuser( idTEXTPRIMARYKEYNOTNULL, passwordTEXT, roleTEXT);12.2數據庫設計12.2.3SQLite數據庫的基本操作-刪除表通過DROPTABLE可以刪除表DROPTABLEdatabase_name.table_name刪除user表DROPTABLEIFEXISTS"user";實際刪除表的時候,需要加上IFEXISTS判斷,如果表存在則刪除,不加此判斷的話,表不存在時刪除表會報錯12.2數據庫設計12.2.3SQLite數據庫的基本操作-添加數據通過INSERTINTO語句可以向數據庫中的表中添加新的數據行INSERTINTOuser(id,password,role)VALUES("202201","202201","學生");INSERTINTOuser(id,password,role)VALUES("tea202201","tea202201","教師");INSERTINTOtable_name(column1,column2,column3,...columnN)VALUES(value1,value2,value3,...valueN);12.2數據庫設計12.2.3SQLite數據庫的基本操作-查詢數據通過SELECT語句可以從數據庫的表中獲取數據,以結果表的形式返回數據。SELECT語句的查詢有多種形式,以下將介紹:單表查詢條件查詢多表查詢模糊查詢12.2數據庫設計12.2.3SQLite數據庫的基本操作-查詢數據-單表查詢單表查詢的基本語法格式如下。SELECTcolumn1,column2,...columnNFROMtable_name;columnN是指table_name表的字段獲取表中所有的字段SELECT*FROMtable_name;12.2數據庫設計12.2.3SQLite數據庫的基本操作-查詢數據-單表查詢查詢user表中id和password字段SELECTid,passwordFROMuser;12.2數據庫設計12.2.3SQLite數據庫的基本操作-查詢數據-條件查詢條件查詢需要使用WHERE子句SELECTcolumn1,column2,...columnNFROMtable_nameWHERE[condition];SELECT*FROMuserWHEREid="202201";查詢user表中id為202201的數據12.2數據庫設計12.2.3SQLite數據庫的基本操作-查詢數據-多表查詢設計一個teacher表,表中有字段工號id和姓名name,假設教師的用戶名就是教師的工號現希望查詢出工號為tea202201的教師的工號、姓名和密碼,其中密碼需要teacher表和user表兩表查詢,從user表中取出教師密碼。SELECTteacher.id,name,passwordFROMuser,teacherWHEREteacher.id=user.idANDteacher.id="tea202201";12.2數據庫設計12.2.3SQLite數據庫的基本操作-查詢數據-模糊查詢模糊查詢需要使用LIKE子句SELECTcolumn_listFROMtable_nameWHEREcolumnLIKE[condition];SELECT*FROMuserWHEREidLIKE"%2022%";查詢user表中id含有2022的數據LIKE子句后的條件由“%”和“_”運算符組成,“內容%”表示以“內容”開頭,“%內容”表示以“內容”結尾,“%內容%”表示任意位置含有“內容”,“_”運算符則表示占位符,代表單一的數字或字符。12.2數據庫設計12.2.3SQLite數據庫的基本操作-修改數據通過UPDATE語句可以修改表中已有的數據UPDATEtable_nameSETcolumn1=value1,column2=value2....,...columnN=valueNWHERE[condition];UPDATEuserSETpassword="123456"WHEREid="202201";將user表中用戶名為202201的數據中的密碼修改為12345612.2數據庫設計12.2.3SQLite數據庫的基本操作-刪除數據通過DELETE語句可以刪除表中已有的數據DELETEFROMtable_nameWHERE[condition];DELETEFROMuserWHEREid="tea202201";刪除user表中用戶名為tea202201的數據12.2數據庫設計12.2.3SQLite數據庫的基本操作-排列數據通過ORDERBY子句可以基于一個列或多個列按照升序或者降序順序排列表中數據SELECTcolumn-listFROMtable_name[WHEREcondition][ORDERBYcolumn1,column2,...columnN][ASC|DESC];12.2數據庫設計12.2.3SQLite數據庫的基本操作-排列數據設計一個學生考勤記錄表record,記錄學生的學號(student_id)、姓名(student_name)、簽到時間(time)將record表中的數據按照time字段從近到遠進行排序SELECT*FROMrecordORDERBYtimeDESC12.2數據庫設計12.2.4項目數據庫設計數據表字段字段類型說明option(選項表)option_idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號question_idINTEGER題目編號detailTEXT選項內容scoreINTEGER選項對應分值record(記錄表)record_idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號student_idTEXT學生學號teacher_idTEXT教師工號questionaire_idINTEGER問卷編號mental_scoreINTEGER心理測試分數mental_resultTEXT心理測試結果test_timeTEXT心理測試時間is_counselTEXT是否已輔導suggestionTEXT咨詢建議counsel_timeTEXT咨詢時間數據表字段字段類型說明user(用戶表)idTEXTPRIMARYKEY用戶名passwordTEXT密碼roleTEXT角色,老師或者學生student(學生表)idTEXTPRIMARYKEY學號nameTEXT姓名gradeTEXT年級classTEXT班級sexTEXT性別teacher(教師表)idTEXTPRIMARYKEY工號nameTEXT姓名sexTEXT性別questionaire(問卷表)idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號nameTEXT問卷名稱questions(題目表)question_idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號questionaire_idINTEGER問卷編號numberINTEGER題目序號titleTEXT題目內容表中的數據相互關聯,user表需要內置管理員數據12.2數據庫設計12.2.4項目數據庫設計心理測試問卷需要先內置在數據庫中,本項目中采用抑郁癥量表進行測試questionaire表questions表option表的部分內容12.2數據庫設計12.2.5使用Python操作SQLite數據庫在Python中可以直接操作SQLite數據庫,需要導入sqlite3庫importsqlite3下面將會介紹:連接數據庫Connection對象Cursor對象操作數據庫的總體流程12.2數據庫設計12.2.5使用Python操作SQLite數據庫-連接數據庫連接數據庫需要使用connect()方法sqlite3.connect(database)connect()方法用于連接一個SQLite數據庫文件database,如果給定的數據庫文件database不存在,則會新建一個數據庫。如果不希望在當前目錄中創(chuàng)建數據庫,則可以指定帶有路徑的文件名,在任意位置創(chuàng)建數據庫。connect()方法連接數據庫后會返回一個Connection對象。12.2數據庫設計12.2.5使用Python操作SQLite數據庫-Connection對象Connection類是sqlite3模塊中的最重要的類之一方法說明cursor()返回連接的游標,即Cursor對象commit()提交當前事務,不提交則自上一次調用commit()以來所做的任何動作都不會保存到數據庫中close()關閉數據庫連接12.2數據庫設計12.2.5使用Python操作SQLite數據庫-Cursor對象Cursor類也是sqlite3模塊中的最重要的類之一方法說明execute(sql[,parameters])執(zhí)行一條SQL語句,該SQL語句可以參數化,sqlite3模塊支持兩種類型的占位符,問號和命名占位符,例如:cursor.execute('select*fromuserwhereid=?',(id,))executemany(sql,seq_of_parameters)對seq_of_parameters中的所有參數或映射執(zhí)行一個SQL命令executescript(sql_script)執(zhí)行多條SQL語句fetchone()獲取查詢結果集中的一行,返回值為單一序列;當沒有可用數據時,返回Nonefetchmany(size=1)獲取查詢結果集中的多行,返回一個列表;當沒有可用數據時,返回空列表。size參數用于指定獲取的行數fetchall()獲取查詢結果集中的所有(剩余)行,返回一個列表;當沒有可用數據時,返回空列表12.2數據庫設計12.2.5使用Python操作SQLite數據庫-操作數據庫的總體流程importsqlite3con=sqlite3.connect("mental_test.db")cursor=con.cursor()cursor.execute('select*fromuser')result_list=cursor.fetchall()con.close()連接數據庫,并返回一個Connection對象通過Connection對象,創(chuàng)建一個Cursor對象調用Cursor對象的excute()、excutemany()或者excutescript()執(zhí)行一行或者多行SQL語句如果執(zhí)行的SQL語句是查詢語句,則通過Cursor對象的fetchone()、fetchmany()或者fetchall()方法獲取查詢結果;如果執(zhí)行的SQL語句是添加、修改或者刪除數據的SQL語句,則需要通過Connection對象的commit()方法向數據庫提交修改。關閉數據庫12.2數據庫設計12.2.5使用Python操作SQLite數據庫-操作數據庫的總體流程使用Python向user表中插入數據importsqlite3con=sqlite3.connect("mental_test.db")cursor=con.cursor()id,password,role="202203","202203","學生"cursor.execute(f'INSERTINTOuser(id,password,role)VALUES("{id}","{password}","{role}")')mit()con.close()12.3PyQt6GUI界面設計PyQt6簡介PyQt6的安裝與配置QtDesigner的使用項目PyQt6控件的使用項目PyQt6信號與槽的使用項目界面設計12.3PyQt6GUI界面設計12.3.1PyQt6簡介Qt是C++語言編寫的跨平臺GUI庫,圖形用戶界面(GraphicalUserInterface,GUI)是使用戶能通過圖像或圖形與設備進行交互的程序接口。PyQt是Qt框架的Python語言實現,既保留了Qt的高運行速率,又提高了開發(fā)效率,PyQt幾乎能實現Qt的所有功能。GUI在過去的一段時間是主流應用,但是Web應用由于其不用安裝直接在瀏覽器中就能運行的優(yōu)勢,在近幾年格外流行。但是實際上,Web應用在瀏覽器部分的邏輯代碼大多由JavaScript語言編寫,運行效率較低,且無法完全控制本機硬件,例如攝像頭、藍牙設備、打印機等,而Web應用的劣勢恰好是GUI的強項,故GUI仍會占有重要的地位。12.3PyQt6GUI界面設計12.31PyQt6簡介在Python中,實現GUI編程的不僅有PyQt庫,還有Tkinter、PySide等庫,但是Tkinter不具有類似于PyQt中的QtDesigner(UI設計工具,可視化創(chuàng)建UI文件,并能通過工具快速編譯Python文件,即自動生成UI代碼)的工具,PySide的官方文檔不夠細致,使用者不夠廣泛,故本項目選擇使用PyQt實現GUI。本項目使用最新的PyQt6版本。12.3PyQt6GUI界面設計12.3.2PyQt6的安裝與配置PyQt6是Python的第三方庫,對PyQt6以及QtDesigner進行安裝,需要使用pip工具pipinstallPyQt6pipinstallPyQt6-tools需要對以下兩個工具進行配置:designer.exe:用于可視化設計GUI界面pyuic6.exe:用于將可視化GUI文件轉化為Python代碼12.3PyQt6GUI界面設計12.3.2PyQt6的安裝與配置12.3PyQt6GUI界面設計12.3.2PyQt6的安裝與配置-designer.exe12.3PyQt6GUI界面設計12.3.2PyQt6的安裝與配置-pyuic6.exeAuguments參數用于設置.ui文件轉化為.py文件的文件名,$FileName$表示.ui文件名稱,-o表示將.ui文件內容輸出.py文件,$FileNameWithoutExtension$.py表示輸出的.py文件名設置為.ui文件去掉后綴并加上.py,-x用于設置轉換后的.py文件可以直接運行彈出窗口界面。12.3PyQt6GUI界面設計12.3.3QtDesigner的使用QtDesigner的使用:打開QtDesigner工具QtDesigner界面說明QtDesigner界面布局.ui文件轉換為.py文件的方法生成的.py文件的結構說明12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-打開QtDesigner工具12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-QtDesigner界面說明12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-QtDesigner界面布局使用柵格布局,使界面中控件排列變得整齊。除了柵格布局,還有水平布局、垂直布局等。12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-QtDesigner界面布局在柵格布局中可以通過彈簧對控件間距進行調整12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-QtDesigner界面布局對窗口中控件整體進行柵格布局設計,可以使控件自適應窗口大小。12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-QtDesigner界面布局在菜單欄中選擇“窗體”→“預覽”或者使用Ctrl+R快捷鍵可以對窗口進行預覽12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-.ui文件轉換為.py文件12.3PyQt6GUI界面設計12.3.3QtDesigner的使用-生成的.py文件結構說明12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用PyQt6中存在有QMainWindow(主窗口)、QWidget(窗口)、對話框類、按鈕類、文本框類等豐富多樣的控件。QMainWindow、QWidget和QDialog三個類都用于創(chuàng)建窗口。QMainWindow窗口可以包含菜單欄、工具欄、狀態(tài)欄等,是最常見的窗口形式;QDialog是對話框窗口的基類,用于執(zhí)行短期任務,或者與用戶進行交互。主窗口則使用QMainWindow,對話框則使用QDialog,可能作為頂層窗口也可能嵌入其它窗口的情況下使用QWidget類。12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-QWidgetQWidget類是所有用戶界面的基類,所有的窗口和控件都直接或間接繼承自QWidget類。窗口是指程序的整體界面,包含最小化、最大化、關閉按鈕等,控件指按鈕、文本框、表格、進度條等租車行程序的基本元素。類別方法說明窗口設置show()顯示窗口hide()隱藏窗口close()關閉窗口x()、y()獲取窗口左上角的坐標幾何設置width()、height()客戶區(qū)(窗口除標題和邊框外的區(qū)域)的寬度和高度setGeometry(QRect(x,y,width,height))參數為QRect對象,用于改變客戶區(qū)的大小和位置,設置窗口左上角坐標為x,y,設置寬高為width和heightgeometry()獲取客戶區(qū)的大小和位置resize(width,height)改變客戶區(qū)的大小,寬為width,高為heightsize()獲取客戶區(qū)的大小move(x,y)設置窗口的位置頂層設置setWindowTitle(str)設置窗口標題為strsetWindowIcon(QIcon)參數為QIcon類型的對象,用于設置程序圖標12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-QDialogQDialog類用于創(chuàng)建對話框,提供一系列對話框完成特定場景下的功能方法說明setWindowTitle()設置對話框標題setWindowModality()設置窗口模態(tài),取值如下:Qt.WindowModality.NonModal,非模態(tài),可以與其它窗口交互Qt.WindowModality.WindowModal,窗口模態(tài),阻止對其父窗口進行交互Qt.WindowModality.ApplicationModal,應用程序模態(tài),阻止和其它所有窗口進行交互12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-QDialogQMessageBox是QDialog的繼承類,它是一種通用的彈出式對話框,用于通知用戶或者請求用戶的提問和接收應答。方法說明示例顯示效果information(QWidget,title,text,buttons,defaultButton)消息對話框,參數含義如下:QWidget,指定的父窗口控件title,對話框標題text,對話框文本buttons,多個標準按鈕,默認為OK按鈕defaultButtonp,默認選中的標準按鈕,默認值為第一個標準按鈕QMessageBrmation(self,"提示","消息對話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)

question(QWidget,title,text,buttons,defaultButton)問答對話框,參數解釋同information()QMessageBox.question(self,"提問","提問對話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)

warning(QWidget,title,text,buttons,defaultButton)警告對話框,參數解釋同information()QMessageBox.warning(self,"警告","警告對話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)

critical(QWidget,title,text,buttons,defaultButton)嚴重錯誤對話框,參數解釋同information()QMessageBox.critical(self,"嚴重錯誤","嚴重錯誤對話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-標簽控件:QLabelQLabel類用于創(chuàng)建標簽對象,可以顯示不可編輯的文本、圖片或者gif動圖等方法說明setText(str)設置標簽的文本內容為strtext()返回標簽的文本內容12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-文本框類控件:QLineEditQLintEdit類用于創(chuàng)建單行文本框控件,可以輸入單行字符串,輸入多行字符串需要使用QTextEdit。方法說明setText(str)設置文本框內容為strtext()返回文本框內容setEchoMode()設置文本框顯示格式,文本顯示格式的值如下:QLineEdit.EchoMode.Normal,正常顯示輸入的字符,為默認選項QLineEdit.EchoMode.NoEcho,不顯示任何輸入的字符,常用語密碼類型的輸入,且其密碼長度需要保密時QLineEdit.EchoMode.Password,顯示平臺相關的密碼掩碼字符而不是實際輸入的字符QLineEdit.EchoMode.PasswordEchoOnEdit,在編輯時顯示字符,負責顯示密碼類型的輸入setReadOnly()設置文本框為只讀的,參數為True或False,其中True為只讀,然則不是只讀的12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-文本框類控件:QTextEditQTextEdit類用于創(chuàng)建多行文本框控件,可以顯示多行文本內容,當文本內容超出控件顯示范圍時,可以顯示水平垂直滾動條。方法說明setPlainText(str)設置多行文本框的文本內容為strtoPlainText()返回多行文本框的文本內容12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-按鈕類控件:QPushButtonQPushButton用于創(chuàng)建長方形的按鈕,可以顯示文本、圖標等,單擊按鈕可以執(zhí)行相應的命令或者響應事件。方法說明setText(str)設置按鈕的顯示文本為strtext()返回按鈕的顯示文本為了使按鈕操作方便,可以為QPushButton設置快捷鍵。設置快捷鍵需要使用方法setShortcut()。#Key_后加某個鍵名一般可以把某個鍵作為快捷鍵pushButton.setShortcut(Qt.Key.Key_Return) #回車鍵作為快捷方式pushButton.setShortcut(Qt.Key.Key_Tab) #Tab鍵作為快捷方式#組合鍵可以用引號來表示,注意與其它軟件快捷鍵是否沖突pushButton.setShortcut("Alt+S") #以Alt+S鍵作為快捷方式12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-按鈕類控件:QRadioButtonQRadioButton用于創(chuàng)建單選按鈕,為用戶提供多選一的功能。QRadioButton創(chuàng)建的單選按鈕默認是獨占的(Exclusive),對于繼承自同一父類Widget的多個單選按鈕屬于同一個按鈕組合,在單選按鈕組合中,一次只能選擇一個單選按鈕。如果需要多個按鈕組合,則需要將它們放在QGroupBox或QButtonGroup中。方法說明setText(str)設置單選按鈕的顯示文本為strtext()返回單選按鈕的顯示文本isChecked()返回單選按鈕的狀態(tài),返回值為True或FalsesetChecked(bool)設置單選按鈕的狀態(tài),True為選中,False為未選中setAutoExclusive(bool)設置自動排它特性,True時表示屬于同一父部件的按鈕任何時候只能選中一個按鈕12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-下拉列表框控件:QComboBoxQComboBox用于創(chuàng)建下拉列表框,集按鈕和下拉選項于一體方法說明addItem()添加一個下拉選項addItems()從列表中添加下拉選項currentText()返回選中選項的文本currentIndex()返回選中選項的索引12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-表格控件:QTableWidgetQTableWidget用于創(chuàng)建數據表格,每一個單元數據是通過QTableWidgetItem對象實現的方法說明setRowCount()設置QTableWidget表格控件的行數setColumnCount()設置QTableWidget表格控件的列數setItem(int,int,QTableWidgetItem)對QTableWidget表格控件中的指定單元格處添加數據,通常是文本、圖標、復選框等,前兩個參數分別表示行和列setCellWidget(int,int,QWidget)對QTableWidget表格控件中的指定單元格處添加控件,前兩個參數分別表示行和列,第3個參數為添加的控件setEditTriggers()設置表格是否可編輯,設置編輯規(guī)則枚舉值,常用類型如下:QAbstractItemView.EditTrigger.NoEditTriggers不能對表格內容進行修改QAbstractItemView.EditTrigger.CurrentChanged任何時候可修改QAbstractItemView.EditTrigger.DoubleClicked雙擊時修改setSelectionBehavior()設置表格的選擇行為,常用行為如下:QAbstractItemView.SelectionBehavior.SelectItems選中單元格QAbstractItemView.SelectionBehavior.SelectRows選中一行QAbstractItemView.SelectionBehavior.SelectColumns選中一列12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-列表控件:QListWidgetQListWidget用于創(chuàng)建數據列表,可以從列表中添加或刪除條目,列表中的每個條目都是一個QListWidgetItem對象。方法說明addItem()在列表中添加QListWidgetIem對象或字符串item(int)如果指定列存在則返回指定列的內容,否則返回Nullrow(QListWidgetItem)返回指定項目所在的行12.3PyQt6GUI界面設計12.3.4項目PyQt6控件的使用-列表控件:QListWidgetQDateTimeEdit用于創(chuàng)建編輯日期時間的控件,可以使用鍵盤的上下按鈕來增加或者減少日期時間值。方法說明setDisplayFormat()設置時間日期格式:yyyy,代表年份,4位數的數值MM,代表月份,取值范圍為01~12dd,代表日,取值范圍為01~31HH,代表小時,取值范圍為00~23mm,代表分鐘,取值范圍為00~59ss,代表秒,取值范圍為00~59setDateTime(Union[QDateTime,datetime.datetime])設置具體的時間和日期,參數為QDateTime類型12.3PyQt6GUI界面設計12.3.5項目PyQt6信號與槽的使用信號(Signal)和槽(Slot)是Qt中的核心機制,也同樣適用于PyQt中對象之間的通信,所有繼承于QWidget的控件都支持信號與槽機制。當信號發(fā)射時,連接的槽函數會自動執(zhí)行,在PyQt6中信號與槽通過object.signal.connect()方法連接。一個信號可以連接多個槽,一個信號可以連接另一個信號,一個槽可以監(jiān)聽多個信號。12.3PyQt6GUI界面設計12.3.5項目PyQt6信號與槽的使用-內置信號和槽函數的連接內置信號有多種形式,例如標題改變windowTitleChanged,文本內容改變textChanged,按鈕被點擊clicked,按鈕被按下pressed等。classMyWidget(QWidget):def__init__(self):QWidget.__init__(self)#繼承父類QWidget的屬性、方法等self.resize(300,100)#設置窗口大小為300,100self.setWindowTitle("內置信號與槽函數的連接")#設置窗口標題button=QPushButton(self)#創(chuàng)建一個按鈕button.setText("這是一個按鈕")#設置按鈕的文本內容#建立信號與槽之間的連接,信號為按鈕點擊clicked,槽函數僅傳遞函數名,即窗口關閉函數close()的函數名closebutton.clicked.connect(self.close)if__name__=='__main__':app=QApplication(sys.argv)window=MyWidget()#創(chuàng)建自定義的窗口類MyWidgetwindow.show()#顯示窗口sys.exit(app.exec())#確保窗口主循環(huán)安全結束點擊按鈕時關閉窗口12.3PyQt6GUI界面設計12.3.5項目PyQt6信號與槽的使用-內置信號和自定義槽函數的連接fromPyQt6.QtWidgetsimport*importsysclassMyWidget(QWidget):def__init__(self):QWidget.__init__(self)self.resize(400,100)self.setWindowTitle("內置信號與自定義槽函數的連接")button=QPushButton(self)button.setText("點擊按鈕改變窗口標題")#clicked信號與槽函數button_change連接button.clicked.connect(self.button_change)defbutton_change(self):self.setWindowTitle("按鈕已點擊")if__name__=='__main__':app=QApplication(sys.argv)window=MyWidget()window.show()sys.exit(app.exec())點擊按鈕時,改變窗口標題為“按鈕已點擊”當槽函數中的語句僅有一行時,可以將槽函數寫成匿名函數的形式,第11~13行可以替換為以下代碼:button.clicked.connect(lambda:self.setWindowTitle("按鈕已點擊"))12.3PyQt6GUI界面設計12.3.5項目PyQt6信號與槽的使用-槽函數的傳參槽函數的傳參可以使用functools模塊中的partial對象fromfunctoolsimportpartialpartial(func[,*args][,**keywords])func為函數名,*args以及**keywords為向函數func傳遞的參數。12.3PyQt6GUI界面設計12.3.5項目PyQt6信號與槽的使用-槽函數的傳參fromPyQt6.QtWidgetsimport*fromfunctoolsimportpartialimportsysclassMyWidget(QWidget):def__init__(self):QWidget.__init__(self)self.resize(300,100)self.setWindowTitle("槽函數的傳參")button=QPushButton(self)button.setText("點擊按鈕改變窗口標題")#clicked信號與槽函數button_change連接button.clicked.connect(partial(self.button_change,"小千"))defbutton_change(self,name):self.setWindowTitle(f"{name},你好!")if__name__=='__main__':app=QApplication(sys.argv)window=MyWidget()window.show()sys.exit(app.exec())點擊按鈕時,改變窗口標題為“小千,你好!”12.3PyQt6GUI界面設計12.3.6項目界面設計以下將對項目的界面設計進行介紹,主要包括項目界面所用控件、布局以及界面之間的關系。注意項目中所有的對話框均選擇應用程序模態(tài)(ApplicationModel),阻止和其它所有窗口進行交互。項目界面間關系12.3PyQt6GUI界面設計12.3.6項目界面設計-用戶登錄界面用戶登錄界面以管理員登錄則跳轉用戶管理界面,以學生登錄則跳轉學生心理自測界面,以心理教師登錄則跳轉心理教師輔導界面。用戶登錄界面存放在login.ui文件中(對應于login.py文件)12.3PyQt6GUI界面設計12.3.6項目界面設計-用戶管理界面用戶管理界面用于管理心理教師和學生的信息,可以進行添加、編輯和刪除操作。點擊“搜索”按鈕可以按照條件對記錄進行檢索并顯示在表格中。用戶管理界面存放于admin.ui文件中(對應于admin.py文件)。12.3PyQt6GUI界面設計12.3.6項目界面設計-用戶管理界面選中一列數據,點擊“刪除”按鈕即可對數據項進行刪除。點擊“添加”或者“編輯”按鈕,會彈出可以編輯教師或者學生信息的對話框,對話框存放于teacher_detail.ui和student_detail.ui文件中(對應于teacher_detail.py和student_detail.py文件)。12.3PyQt6GUI界面設計12.3.6項目界面設計-學生心理自測界面學生心理自測界面用于學生進行心理自測,對自測結果進行查看以及學生修改登錄密碼。學生心理自測界面存放于student.ui文件中(對應于student.py)?!耙钟舭Y測試”頁面“查看已測結果”頁面“修改密碼”頁面12.3PyQt6GUI界面設計12.3.6項目界面設計-學生心理自測界面學生點擊“開始測試”按鈕,即會出現心理測試題目及選項。當測試結果是有抑郁傾向時,會出現“選擇輔導老師”按鈕。點擊圖中的“選擇輔導老師”按鈕,會彈出選擇輔導老師的對話框,存放于choice_teacher.ui文件中(對應于choice_teacher.py文件)12.3PyQt6GUI界面設計12.3.6項目界面設計-學生心理自測界面對于“查看已測結果”頁面,表格最后一列“查看詳情”設置為按鈕控件,文本內容為“查看”。點擊“查看”按鈕,會彈出對話框,顯示記錄詳情。對話框存放于record_detail.ui文件中(對應于record_detail.py文件)。12.3PyQt6GUI界面設計12.3.6項目界面設計-心理教師輔導界面心理教師輔導界面用于教師進行心理輔導,對選擇自己的學生的心理測試結果進行查看,與學生約定咨詢時間并提出咨詢建議,修改登錄密碼。心理教師輔導界面存放于teacher.ui文件中(對應于teacher.py)12.3PyQt6GUI界面設計12.3.6項目界面設計-心理教師輔導界面在“學生情況”頁面中,表格最后一列“輔導”設置為按鈕控件,如果學生未被輔導,則按鈕文本設置為“輔導”;如果學生已被輔導,則按鈕文本顯示為“查看”。點擊按鈕,會彈出對話框,顯示學生具體詳情。對話框存放于tutor_detail.ui文件中(對應于tutor_detail.py文件)。12.4系統總體設計程序設計思路系統模塊設計12.4系統總體設計12.4.1程序設計思路12.4系統總體設計12.4.2系統模塊設計12.5系統詳細設計用戶登錄功能用戶管理功能心理測試功能心理輔導功能修改密碼功能12.5系統詳細設計12.5.1用戶登錄功能-界面控件名稱用戶登錄界面所用的控件名稱(login.ui)12.5系統詳細設計12.5.1用戶登錄功能-方法及其實現功能用戶登錄功能實現在mental_test.py文件中方法實現功能所屬類__init__()初始化界面,建立信號與槽的連接,設置快捷方式Loginverify()驗證用戶登錄Loginmain()初始化系統應用無12.5系統詳細設計12.5.1用戶登錄功能-程序的具體實現-__init__()方法def__init__(self):QWidget.__init__(self)loginui.setupUi(self)#使loginui中的設計展示在用戶登錄窗口上loginui.pushButton.clicked.connect(self.verify)#建立pushButton按鈕clicked信號與槽函數verify()的連接loginui.pushButton.setShortcut(Qt.Key.Key_Return)#設置快捷方式12.5系統詳細設計12.5.1用戶登錄功能-程序的具體實現-verify()方法defverify(self):username=loginui.lineEdit.text()#獲取lineEdit的文本內容password=loginui.lineEdit_2.text()#獲取lineEdit_2的文本內容#從數據庫user表中查找id為username,password為password的記錄sql=f"SELECT*FROMuserWHEREid='{username}'ANDpassword='{password}'"cursor.execute(sql)#執(zhí)行sql語句res=cursor.fetchone()#取出查詢記錄中的第一條ifresisNone:#如果記錄為空,說明用戶名或密碼有誤mb=QMessageBox()mb.critical(self,"提示","用戶名或密碼有誤")#創(chuàng)建嚴重警告對話框loginui.lineEdit_2.setText("")#清空lineEdit_2的內容mb.show()#顯示對話框elifres[2]=="管理員":#登錄人員為管理員self.window2=admin_func.Admin()#調用管理員界面self.close()#關閉當前登錄界面self.window2.show()#顯示管理員界面self.window2.setWindowIcon(QIcon("icons:mental_test.png"))#設置圖標elifres[2]=="學生":#登錄人員為學生self.window2=student_func.Student(username)#調用學生自測界面self.close()#關閉當前登錄界面self.window2.show()#顯示學生自測界面self.window2.setWindowIcon(QIcon("icons:mental_test.png")elifres[2]=="老師":#登錄人員為教師self.window2=teacher_func.Teacher(username)#調用教師輔導界面self.close()#關閉當前登錄界面self.window2.show()#顯示教師輔導界面self.window2.setWindowIcon(QIcon("icons:mental_test.png"))12.5系統詳細設計12.5.1用戶登錄功能-程序的具體實現-main()方法defmain():app=QApplication(sys.argv)window=Login()#創(chuàng)建控件類Login的實例對象window.setWindowIcon(QIcon("icons:mental_test.png"))#設置圖標window.show()sys.exit(app.exec())12.5系統詳細設計12.5.2用戶管理功能-界面控件名稱“心理教師信息”頁面(admin.ui)“教師信息”對話框(teacher_detail.ui)“學生信息”頁面(admin.ui)“學生信息”對話框(student_detail.ui)12.5系統詳細設計12.5.2用戶管理功能-方法及其實現功能用戶管理功能實現在admin_func.py文件中方法實現功能所屬類__init__()初始化界面,顯示教師和寫生信息,建立信號與槽的連接,設置快捷方式Adminshow_teacher_info(self,para="")展示教師信息,para參數為字符串格式,用于查找信息的SQL語句條件拼接Adminsearch_teacher()檢索教師信息Adminadd_teacher()初始化添加教師信息對話框,建立信號與槽的連接Adminadd_Tbutton()添加教師對話框中“確定”按鈕的槽函數,用于添加教師信息Adminedit_teacher()初始化編輯教師信息對話框,建立信號與槽的連接Adminedit_Tbutton()編輯教師對話框中“確定”按鈕的槽函數,用于編輯教師信息Admindel_teacher()初始化刪除教師信息提示框,建立信號與槽的連接Adminchange_Tbutton()刪除教師信息提示框中按鈕的槽函數,用于刪除教師信息Adminshow_student_info(self,para="")展示學生信息,para參數為字符串格式,用于查找信息的SQL語句條件拼接Adminsearch_student()檢索學生信息Adminadd_student()初始化添加學生信息對話框,建立信號與槽的連接Adminadd_Sbutton()添加學生對話框中“確定”按鈕的槽函數,用于添加學生信息Adminedit_student()初始化編輯學生信息對話框,建立信號與槽的連接Adminedit_Sbutton()編輯學生對話框中“確定”按鈕的槽函數,用于編輯學生信息Admindel_student()初始化刪除學生信息提示框,建立信號與槽的連接Adminchange_Sbutton()刪除學生信息提示框中按鈕的槽函數,用于刪除學生信息Admin12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-__init__()方法def__init__(self):QWidget.__init__(self)adminui.setupUi(self)self.show_teacher_info()#展示教師信息self.show_student_info()#展示學生信息adminui.addTButton.clicked.connect(self.add_teacher)#添加教師信息adminui.editTButton.clicked.connect(self.edit_teacher)#編輯教師信息adminui.delTButton.clicked.connect(self.del_teacher)#刪除教師信息adminui.searchTButton.clicked.connect(self.search_teacher)#檢索教師信息adminui.searchTButton.setShortcut(Qt.Key.Key_Return)#設置快捷鍵12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-show_teacher_info(self,para="")方法defshow_teacher_info(self,para=""):#para用于SQL語句的拼接,按條件進行查詢sql=f"SELECT*FROMteacher{para}ORDERBYid"#按照id排列教師信息,當para為None時,則顯示所有信息cursor.execute(sql)teacher_list=cursor.fetchall()adminui.teacherTab.setRowCount(len(teacher_list))#按照教師個數設置表格行數forrowinrange(len(teacher_list)):forcellinrange(len(teacher_list[row])):adminui.teacherTab.setItem(row,cell,QTableWidgetItem(teacher_list[row][cell]))#將數據庫中取出的數據逐個填入單元格中12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-search_teacher()方法defsearch_teacher(self):ifadminui.teacherBox.currentText()=="工號":id=adminui.teacherEdit.text()para=f'WHEREidLIKE"%{id}%"'#設置參數para為模糊查詢工號idself.show_teacher_info(para)#將para傳入show_teacher_info()方法中重新顯示列表else:name=adminui.teacherEdit.text()para=f'WHEREnameLIKE"%{name}%"'#設置參數para為模糊查詢姓名nameself.show_teacher_info(para)#將para傳入show_teacher_info()方法中重新顯示列表12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-add_teacher()方法defadd_teacher(self):#創(chuàng)建添加教師時展示的對話框,設置按鈕點擊信號的槽函數self.Tdialog=QDialog()self.Tdialog.setWindowModality(Qt.WindowModality.ApplicationModal)self.Tdialogui=teacher_detail.Ui_Dialog()self.Tdialogui.setupUi(self.Tdialog)self.Tdialogui.okButton.clicked.connect(self.add_Tbutton)self.Tdialogui.cancelButton.clicked.connect(self.Tdialog.close)self.Tdialog.show()self.Tdialog.exec()12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-add_Tbutton()方法defadd_Tbutton(self):id=self.Tdialogui.idEdit.text()#獲取對話框中工號信息name=self.TEdit.text()#獲取對話框中姓名信息sex=self.Tdialogui.sexBox.currentText()#獲取對話框中性別信息select_sql=f"SELECTidFROMuser;"#取出數據庫中user表中所有信息cursor.execute(select_sql)id_list=cursor.fetchall()#獲取user表中的所有idifnotidornotnameorid.isspace()orname.isspace():#教師的工號或者姓名不能為空mb=QMessageBox()mb.warning(self,"失敗","教師的工號和姓名不能為空!")elif(id,)inid_list:#工號已存在時提示不能添加mb=QMessageBox()mb.warning(self,"失敗","該人員已存在,不能添加!")else:#工號不存在時可以添加#添加教師時,需要分別向teacher表和user表中增加一條數據,添加教師的同時為其分配用戶sql=f'INSERTINTOteacher(id,name,sex)VALUES("{id}","{name}","{sex}");'\f'INSERTINTOuser(id,password,role)VALUES("{id}","{id}","老師");'cursor.executescript(sql)mit()mb=QMessageBox()rmation(self,"成功","添加教師成功!")

self.search_teacher()#添加教師信息后,更新教師信息顯示self.Tdialogui.idEdit.setText("")self.TEdit.setText("")12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-edit_teacher()方法defedit_teacher(self):items=adminui.teacherTab.selectedItems()#獲取表格中選擇的記錄ifnotitems:#如果沒有選擇記錄,則進行提示mb=QMessageBox()rmation(self,"提示","選中記錄后才能編輯,請選擇記錄!")else:#選擇教師記錄后對此記錄進行編輯self.Tdialog=QDialog()self.Tdialog.setWindowModality(Qt.WindowModality.ApplicationModal)self.Tdialogui=teacher_detail.Ui_Dialog()self.Tdialogui.setupUi(self.Tdialog)self.Tdialogui.idEdit.setText(items[0].text())self.TEdit.setText(items[1].text())#使用index()函數得到記錄中性別在("男","女")中的索引,再令下拉選擇框顯示索引位置的內容self.Tdialogui.sexBox.setCurrentIndex(("男","女").index(items[2].text()))#設置idEdit為只讀形式,教師id不能修改,否則會影響登錄時用戶類型判斷self.Tdialogui.idEdit.setReadOnly(True)self.Tdialogui.okButton.clicked.connect(self.edit_Tbutton)self.Tdialogui.cancelButton.clicked.connect(self.Tdialog.close)self.Tdialog.show()self.Tdialog.exec()12.5系統詳細設計12.5.2用戶管理功能-程序的具體實現-edit_Tbutton()方法defedit_Tbutton(self):id=self.Tdialogui.idEdit.text()name=self.TEdit.text()sex=self.Tdialogui.sexBox.currentText()ifnotname:#姓名為空的時候無法提交mb=QMessageBox()rmation(self,"提示","姓名為空,無法提交!")else:sql=f'UPDATEteachersetname="{name}",sex="{sex}"whereid="{id}"'cursor.execute(sql)mit()mb=QMessageBox()rmation(self,"成功","編輯教師信息成功!")self.search_teacher()#編輯教師信息后,更新教師信息顯示self.Tdialog.clos

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論