孩子马上要上学了,出差路上顺手写个练习口算的程序跟大家分享下,如果家里有同款的宝宝,正好可以拿去,不谢!
先说下自己的需求:
1.基本的计算功能,本来想只写下加法就可以了,想了想顺手就把加减乘除都写了
2.计算的范围可以通过界面修改,这样大概1-6年级都可以用了吧
3.题目的数量可以设定
4.正确错误可以进行统计和反馈
5.如果不希望孩子用电脑,可以生成文件打印到纸上
说完需求,聊下自己的思路
1.设计UI
在这里插入图片描述
2.基本功能
功能比较简单,所以就不每个点都陈述了,主要分享下几个点吧
第一,整数验证,为了避免输入的内容不是整数,我对6个lineEdit单行输入框进行了整数输入限定。方法是通过PyQt5里面的QreExp模块设定,利用正则re判断,代码如下:
整数校验器
regExp = QRegExp('\d*')
int_num = QRegExpValidator(regExp)
self.lineEdit.setValidator(int_num)
第二,加减乘除按钮的互斥设定。两个思路,一个是通过sender()方法,点击按钮的同时发射当前按钮的内容来判断。第二个方法,当单击某个按钮时,其他三个按钮的状态相反,需要4个同类型的函数。因为考虑到后面计算过程的判断,自己选择了第二个方法,虽然多了几行代码,但是相对好理解。
def signal01(self):
self.pushButton.setChecked(True)
self.pushButton_2.setChecked(False)
self.pushButton_3.setChecked(False)
self.pushButton_4.setChecked(False)
self.label_3.setText('+')
def signal02(self):
self.pushButton.setChecked(False)
self.pushButton_2.setChecked(True)
self.pushButton_3.setChecked(False)
self.pushButton_4.setChecked(False)
self.label_3.setText('-')
def signal03(self):
self.pushButton.setChecked(False)
self.pushButton_2.setChecked(False)
self.pushButton_3.setChecked(True)
self.pushButton_4.setChecked(False)
self.label_3.setText('×')
def signal04(self):
self.pushButton.setChecked(False)
self.pushButton_2.setChecked(False)
self.pushButton_3.setChecked(False)
self.pushButton_4.setChecked(True)
self.label_3.setText('÷')
第三,计算过程,加法和乘法相对比较简单,就不赘述了。因为小学没有负数,所以减法需要先判断大小,将较大的数设置在前面。除法因为牵扯到小数,孩子还做不了,所以进行了整除的设定,通过while循环先找到可以整除的两个数,再进行计算。
while 1:
random_num01 = random.randint(int(self.lineEdit_2.text()),
int(self.lineEdit_3.text())) # 第一个要计算的数
random_num02 = random.randint(int(self.lineEdit_4.text()),
int(self.lineEdit_5.text())) # 第二个要计算的数
if random_num02 == 0:
continue
if random_num01 < random_num02:
a = random_num02
b = random_num01
if a % b == 0:
self.label_2.setText(str(a))
self.label_4.setText(str(b))
self.lineEdit_result.setText('')
第四,保存。这应该是最简单的功能,直接for循环保存到文件夹即可。
def save(self):
if self.lineEdit.text()!='' and self.lineEdit_2.text()!='' and self.lineEdit_3.text()!='' and self.lineEdit_4.text()!='' and self.lineEdit_5.text()!='':
num =int(self.lineEdit.text())
range01 =int(self.lineEdit_2.text())
range02 =int(self.lineEdit_3.text())
range03 =int(self.lineEdit_4.text())
range04 =int(self.lineEdit_5.text())
signal = self.label_3.text()
file_name =time.strftime('%Y_%m_%d_%H_%M_%S',time.localtime())+'.txt'
with open(file_name,'w+',encoding='utf-8') as f:
for i in range(num):
result=str(random.randint(range01,range02))+' '+signal+' '+str(random.randint(range03,range04))+'='+'\n'
f.write(result)
QMessageBox.information(self,'状态提示','文件已保存,请在软件相同文件夹下打开\n文件名:%s'%file_name)
另外,几个细节分享。
1.除了整数验证之外,对是否输入(不为空)进行了判断。
2.因为UI调整了很多次,为了每次修改不会影响后续的代码,采用了调用的方式,具体可以参考我的上一篇文章【Python心得】解决PyQt5 UI更新同步问题
最好的学习方法是输出,附上全部代码,需要的随意吧。一共2个部分,主代码和UI部分。
主代码部分
# Author WangKun
# date:2020.01.28
'''
1.UI界面
2.可以选择数字的范围
3.可以选择加减乘除
4.计分功能
5.输出打印功能
6.选择多少道题
'''
import sys,time,random
from PyQt5 import QtCore, QtGui, QtWidgets
from Calculator_UI import Ui_MainWindow
from PyQt5.QtGui import QIntValidator, QRegExpValidator
from PyQt5.QtCore import QRegExp
from PyQt5.QtWidgets import QMessageBox
class window(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# 整数校验器
regExp = QRegExp('\d*')
int_num = QRegExpValidator(regExp)
self.lineEdit.setValidator(int_num)
self.lineEdit_2.setValidator(int_num)
self.lineEdit_3.setValidator(int_num)
self.lineEdit_4.setValidator(int_num)
self.lineEdit_5.setValidator(int_num)
self.lineEdit_result.setValidator(int_num)
#开始按钮事件
self.pushButton_6.clicked.connect(self.cal)
#运算符号验证
self.pushButton.clicked.connect(self.signal01)
self.pushButton_2.clicked.connect(self.signal02)
self.pushButton_3.clicked.connect(self.signal03)
self.pushButton_4.clicked.connect(self.signal04)
#计算
self.lineEdit_result.returnPressed.connect(self.result)
#保存功能
self.pushButton_5.clicked.connect(self.save)
#版权信息
self.statusBar.showMessage('作者:诺依晨')
def result(self):
if self.lineEdit.text()!='' and self.lineEdit_2.text()!='' and self.lineEdit_3.text()!='' and self.lineEdit_4.text()!='' and self.lineEdit_5.text()!='':
topic_num = int(self.lineEdit.text())
answer_num = int(self.label_15.text()) # 答题数量
answer_true = int(self.label_16.text()) #答对的数量
if answer_num < topic_num:
num01 =int(self.label_2.text()) #第一个要计算的数
num02 =int(self.label_4.text()) #第二个要计算的数
result_num = 0
answer =self.lineEdit_result.text()
if answer.isdigit(): #如果是数字,就执行计算
answer =int(answer)
# 加法计算
if self.pushButton.isChecked():
result_num = num01+ num02
if answer == result_num:
self.label_7.setText('✔')#设置对号
answer_num += 1 # 总的答题数量+1
self.label_15.setText(str(answer_num))
answer_true += 1 # 答对数量+1
self.label_16.setText(str(answer_true))
random_num01 = random.randint(int(self.lineEdit_2.text()), int(self.lineEdit_3.text())) # 随机数1
random_num02 = random.randint(int(self.lineEdit_4.text()), int(self.lineEdit_5.text())) # 随机数2
self.label_2.setText(str(random_num01))
self.label_4.setText(str(random_num02))
self.lineEdit_result.setText('')
state ='当前答题进度%s/%s,共答对%s题!'%(answer_num,topic_num,answer_true)
self.label_8.setText(state)
if answer_num == topic_num:
QMessageBox.information(self, '系统提示', '当前答题进度%s/%s,共答对%s题!' % (answer_num, topic_num, answer_true))
else:
self.label_7.setText('✘')
self.lineEdit_result.setText('')
answer_num += 1 # 总的答题数量+1
self.label_15.setText(str(answer_num))
self.label_16.setText(str(answer_true))
random_num01 = random.randint(int(self.lineEdit_2.text()), int(self.lineEdit_3.text())) # 随机数1
random_num02 = random.randint(int(self.lineEdit_4.text()), int(self.lineEdit_5.text())) # 随机数2
self.label_2.setText(str(random_num01))
self.label_4.setText(str(random_num02