碼市地址:https://git.coding.net/linzhao/sizeyunsuangui.git
林 釗 -- 201421123105
吳世榮 -- 201421123119
王坤彬 -- 201421123108
一、題目描述:
我們在個人作業1中,用各種語言實現了一個命令行的四則運算小程序。進一步,本次要求把這個程序做成GUI,成為一個有基本功能、一定價值的程序。
二、需求分析:
1、記錄用戶的對錯題數,程序退出再啟動的時候,能把以前的對錯數量保存並在此基礎上增量計算。
2、有計時功能,能顯示用戶開始答題后的消耗時間。
三、程序設計:
1、將程序模塊化,即將不同功能保存在不同模塊中,最后在主模塊上調用不同模塊以實現相關功能。
2、實現GUI界面。
四、代碼展示:
# -----------------------------------------------------------------------------------------------------------------
Menu:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(206, 252)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(70, 180, 41, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(130, 180, 41, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(10, 70, 161, 31))
self.textEdit.setObjectName("textEdit")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 50, 54, 12))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 110, 54, 12))
self.label_2.setObjectName("label_2")
self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_2.setGeometry(QtCore.QRect(10, 130, 161, 31))
self.textEdit_2.setObjectName("textEdit_2")
self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_3.setGeometry(QtCore.QRect(70, 10, 41, 31))
self.textEdit_3.setObjectName("textEdit_3")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(10, 20, 54, 12))
self.label_3.setObjectName("label_3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 206, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "確定"))
self.pushButton_2.setText(_translate("MainWindow", "退出"))
self.label.setText(_translate("MainWindow", "題目"))
self.label_2.setText(_translate("MainWindow", "答案"))
self.label_3.setText(_translate("MainWindow", "題目數量"))
if __name__=="__main__":
import sys
app=QtWidgets.QApplication(sys.argv)
widget=QtWidgets.QWidget()
ui=Ui_MainWindow()
ui.setupUi(widget)
widget.show()
sys.exit(app.exec_())
# -----------------------------------------------------------------------------------------------------------------
Result:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(237, 127)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(140, 50, 75, 23))
self.pushButton.setObjectName("pushButton")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(20, 10, 191, 31))
self.textEdit.setObjectName("textEdit")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 237, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "下一題"))
# -----------------------------------------------------------------------------------------------------------------
End:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(205, 158)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(20, 30, 161, 41))
self.textEdit.setObjectName("textEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(100, 90, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 205, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "退出"))
# -----------------------------------------------------------------------------------------------------------------
main:
import sys
from PyQt5.QtWidgets import QApplication , QMainWindow
from menu import *
from End import *
from Result import *
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
# -----------------------------------------------------------------------------------------------------------------
代碼說明:
menu 是菜單界面,提示用戶輸入題目數量並與用戶完成交互式操作;
Result 是結果界面,顯示用戶輸入正確與否;
End 是結束界面,統計用戶最終成績和答題計時;
main 是主函數,在main函數中調用以上三個模塊以實現相關功能。
五、程序運行:
1、運行程序並輸入題目數量,在輸入答案后點擊確定:
我們可以看到,如果答案正確就會提示回答正確!
點擊下一題繼續往下運行:
回答正確!
下一題:
回答正確!
下一題:
提示回答錯誤並給出正確答案!
下一題:
回答正確!
當完成答題時,點擊下一題就會顯示最終結果:
以上便是程序運行的效果展示,我們可以看到,程序能夠判斷答題者是否輸入了正確答案並計算出答題者的最終成績,顯示答題時間。
六、PSP表格:
PSP2.1 |
Personal Software Process Stages |
Time (%) Senior Student |
Time (%) |
Planning |
計划 |
1.5h |
2.5h |
· Estimate |
估計這個任務需要多少時間 |
45h |
62h |
· Analysis |
需求分析 (包括學習新技術) |
4h |
4.5h |
· Coding Standard |
代碼規范 |
1h |
1h |
· Design |
具體設計 |
3h |
3h |
· Coding |
具體編碼 |
45h |
50h |
· Test |
測試(自我測試,修改代碼,提交修改) |
1.5h |
1h |
Reporting |
報告 |
1.5h |
1.5h |
總結:
我做了窗口的設計,是本次作業中相對簡單的環節。除了這個,在隊友們編程的時候我在一旁幫忙核對、審查代碼,當然,代碼是我們輪流寫的和輪流審查的。這個作業對我來說收貨頗多,很有意義,我從中學會了如何與團隊中的其他人合作。