作品介绍
作品名称:轻松生成Word口算题集
开发环境:PyCharm 2023.3.4 python3.7
用到的库:sys、random、docx
作品简介:根据设置的参数,自动生成随机的口算题目,并将这些题目保存为Word文件。
实现过程
一、阅读器UI设计
1、安装模块和配置工具,参考;
2、运行工具QtDesigner,利用QtDesigner工具箱设计出界面效果(所需要的控件可查看右边区域),保存效果为文件gq.ui;
3、对文件gq.ui执行pyUIC(ui转化为py代码),执行完生成文件gq.py。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file gq.ui## Created by: PyQt5 UI code generator 5.14.2## WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(512, 224) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) Form.setWindowIcon(icon) self.nameEdit = QtWidgets.QLineEdit(Form) self.nameEdit.setGeometry(QtCore.QRect(114, 67, 240, 26)) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.nameEdit.setFont(font) self.nameEdit.setMaxLength(100) self.nameEdit.setObjectName("nameEdit") self.label_8 = QtWidgets.QLabel(Form) self.label_8.setGeometry(QtCore.QRect(30, 30, 81, 20)) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.label_8.setFont(font) self.label_8.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_8.setObjectName("label_8") self.generateButton = QtWidgets.QPushButton(Form) self.generateButton.setGeometry(QtCore.QRect(114, 155, 81, 31)) self.generateButton.setStyleSheet("background-color: rgb(0, 170, 255); ""color: rgb(255, 255, 255);") self.generateButton.setObjectName("generateButton") self.label_13 = QtWidgets.QLabel(Form) self.label_13.setGeometry(QtCore.QRect(30, 70, 81, 20)) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.label_13.setFont(font) self.label_13.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_13.setObjectName("label_13") self.label_14 = QtWidgets.QLabel(Form) self.label_14.setGeometry(QtCore.QRect(200, 30, 201, 20)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label_14.setPalette(palette) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.label_14.setFont(font) self.label_14.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.label_14.setObjectName("label_14") self.label_15 = QtWidgets.QLabel(Form) self.label_15.setGeometry(QtCore.QRect(358, 70, 111, 20)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label_15.setPalette(palette) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.label_15.setFont(font) self.label_15.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.label_15.setObjectName("label_15") self.spinBox = QtWidgets.QSpinBox(Form) self.spinBox.setGeometry(QtCore.QRect(114, 27, 81, 26)) self.spinBox.setMaximum(300) self.spinBox.setProperty("value", 50) self.spinBox.setObjectName("spinBox") self.label_16 = QtWidgets.QLabel(Form) self.label_16.setGeometry(QtCore.QRect(36, 110, 81, 20)) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.label_16.setFont(font) self.label_16.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_16.setObjectName("label_16") self.spinBox_2 = QtWidgets.QSpinBox(Form) self.spinBox_2.setGeometry(QtCore.QRect(114, 107, 81, 26)) self.spinBox_2.setMaximum(99999) self.spinBox_2.setProperty("value", 50) self.spinBox_2.setObjectName("spinBox_2") self.label_17 = QtWidgets.QLabel(Form) self.label_17.setGeometry(QtCore.QRect(200, 110, 221, 21)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label_17.setPalette(palette) font = QtGui.QFont() font.setPointSize(10) font.setBold(False) font.setWeight(50) self.label_17.setFont(font) self.label_17.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.label_17.setObjectName("label_17")
self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "生成口算题")) self.nameEdit.setText(_translate("Form", "口算题")) self.label_8.setText(_translate("Form", "题数:")) self.generateButton.setText(_translate("Form", "开始生成")) self.label_13.setText(_translate("Form", "表名:")) self.label_14.setText(_translate("Form", "默认:50,控件最大值设置了300")) self.label_15.setText(_translate("Form", "默认:口算题")) self.label_16.setText(_translate("Form", "最大数:")) self.label_17.setText(_translate("Form", "默认:50,控件最大值设置了99999"))
二、代码设计
1、新建文件generateQuestions.py,该文件为项目主文件,初始化页面并显示;
2、添加内置模块(下面代码使用)和主方法(用于运行后弹出界面);
from PyQt5.QtWidgets import *# 引入自定义模块import gq# 引入库import sysimport randomfrom docx import Documentfrom docx.shared import Pt
class parentWindow(QWidget, gq.Ui_Form): # 初始化方法 def __init__(self): # 找到父类 首页面 super(parentWindow, self).__init__() # 初始化页面方法 self.setupUi(self) # 点击开始生成 self.generateButton.clicked.connect(self.generate_questions)
if __name__ == __main__: # 每一个PyQt5应用都必须创建一个应用对象 app = QApplication(sys.argv) # 初始化页面 window = parentWindow() # 显示首页 window.show() sys.exit(app.exec_())
3、增加函数generate_arithmetic_question,用来生成随机的口算题;
定义一个列表operators,包含四种基本运算符。
随机选择一个运算符,并根据运算符的类型生成两个操作数和预期的答案。
对于减法和除法,确保结果合理(例如,减法的结果不小于0,除法的结果为整数)。
使用eval函数计算表达式的结果。
# 生成口算题的方法def generate_arithmetic_question(max): operators = [ , -, *, /] operator = random.choice(operators) if operator == : num1 = random.randint(1, max) num2 = random.randint(1, max) elif operator == -: # 减法,确保结果非负 num1 = random.randint(1, max) num2 = random.randint(1, num1) elif operator == *: num1 = random.randint(1, max) num2 = random.randint(1, max) else: # 除法,确保整除且分母不为0 num2 = random.randint(1, int(max / 3)) num1 = num2 * random.randint(1, int(max / 3)) return num1, operator, num2, eval(f"{num1} {operator} {num2}")
4、增加函数generate_questions,用来生成口算题并生成word文件;
从界面获取题目数量、文件名和最大数值。
检查题目数量是否大于0,如果不是,则显示提示信息并返回。
创建一个新的Word文档,并设置默认字体样式和大小。
循环生成指定数量的口算题目,每个题目包括两个操作数、一个操作符和一个答案。
将每个题目和答案添加到Word文档中,并在每个题目后添加一个空行以分隔。
保存Word文档,并显示生成完成的提示信息。
如果发生异常,打印错误信息。
# 生成口算题并生成word文件def generate_questions(self): try: number = self.spinBox.value() file_name = self.nameEdit.text() max_number = self.spinBox_2.value() print(number, file_name, max_number) if number == 0: QMessageBox.information(self, 提示信息, 提示请输入大于0的整数!) return document = Document() style = document.styles[Normal] font = style.font font.name = Arial font.size = Pt(12)
for _ in range(number): num1, op, num2, answer = generate_arithmetic_question(max_number) question = f"{num1} {op} {num2} = ______" document.add_paragraph(question) document.add_paragraph(f"Answer: {answer}") document.add_paragraph() # 空行分隔题目
# 保存到Word文档 filename = f{file_name}.docx document.save(filename) QMessageBox.information(self, 提示信息, 生成完成!) except Exception as e: print(f错误信息:{e})
5、全部代码如下。
"""自动生成口算题,并生成word文件"""from PyQt5.QtWidgets import *# 引入自定义模块import gq# 引入库import sysimport randomfrom docx import Documentfrom docx.shared import Pt
class parentWindow(QWidget, gq.Ui_Form): # 初始化方法 def __init__(self): # 找到父类 首页面 super(parentWindow, self).__init__() # 初始化页面方法 self.setupUi(self) # 点击开始生成 self.generateButton.clicked.connect(self.generate_questions)
# 生成口算题并生成word文件 def generate_questions(self): try: number = self.spinBox.value() file_name = self.nameEdit.text() max_number = self.spinBox_2.value() print(number, file_name, max_number) if number == 0: QMessageBox.information(self, 提示信息, 提示请输入大于0的整数!) return document = Document() style = document.styles[Normal] font = style.font font.name = Arial font.size = Pt(12)
for _ in range(number): num1, op, num2, answer = generate_arithmetic_question(max_number) question = f"{num1} {op} {num2} = ______" document.add_paragraph(question) document.add_paragraph(f"Answer: {answer}") document.add_paragraph() # 空行分隔题目
# 保存到Word文档 filename = f{file_name}.docx document.save(filename) QMessageBox.information(self, 提示信息, 生成完成!) except Exception as e: print(f错误信息:{e})
# 生成口算题的方法def generate_arithmetic_question(max): operators = [ , -, *, /] operator = random.choice(operators) if operator == : num1 = random.randint(1, max) num2 = random.randint(1, max) elif operator == -: # 减法,确保结果非负 num1 = random.randint(1, max) num2 = random.randint(1, num1) elif operator == *: num1 = random.randint(1, max) num2 = random.randint(1, max) else: # 除法,确保整除且分母不为0 num2 = random.randint(1, int(max / 3)) num1 = num2 * random.randint(1, int(max / 3)) return num1, operator, num2, eval(f"{num1} {operator} {num2}")
if __name__ == __main__: # 每一个PyQt5应用都必须创建一个应用对象 app = QApplication(sys.argv) # 初始化页面 window = parentWindow() # 显示首页 window.show() sys.exit(app.exec_())
总结
可以使用库comtypes在生成完word文件后,自动打印文件,一步到位,体验更好。
获取源码方式
如果文章对你有帮助,请帮忙分享、点赞 关注,谢谢
也可以发送相应文章的名字获取源码