【PyQt5】孩子要上小学了,写个软件做练口算吧!

本文作者分享了为孩子上学准备的口算练习软件,该软件支持加减乘除运算,能根据年级调整计算范围,设定题目数量,并提供错误统计和打印功能。文章介绍了UI设计、整数验证、按钮互斥设定、计算逻辑以及保存功能的实现,提供了全部代码供读者参考。
摘要由CSDN通过智能技术生成

孩子马上要上学了,出差路上顺手写个练习口算的程序跟大家分享下,如果家里有同款的宝宝,正好可以拿去,不谢!
先说下自己的需求:
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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学python的设计师

一年后再回首,为自己的成长惊喜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值