自动生成加减混合运算题目

import sys
import random

from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QFileDialog
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt, Inches
import datetime


class MathQuizApp(QWidget):
def __init__(self):
super().__init__()
self.layout = None
self.init_ui()

def init_ui(self):
self.setWindowTitle('加减混合运算')

self.layout = QVBoxLayout()

# 设置输入部分
self.settings_layout = QHBoxLayout()
self.questions_label = QLabel('题目数量')
self.questions_input = QLineEdit()
self.range_label = QLabel('运算范围')
self.range_input = QLineEdit()
self.settings_layout.addWidget(self.questions_label, alignment=Qt.AlignLeft)
self.settings_layout.addWidget(self.questions_input, alignment=Qt.AlignLeft)
self.settings_layout.addWidget(self.range_label, alignment=Qt.AlignLeft)
self.settings_layout.addWidget(self.range_input, alignment=Qt.AlignLeft)
self.layout.addLayout(self.settings_layout)

# 新增输入部分:选择生成的页数
self.pages_layout = QHBoxLayout()
self.pages_label = QLabel('生成页数')
self.pages_input = QLineEdit()
self.pages_layout.addWidget(self.pages_label, alignment=Qt.AlignLeft)
self.pages_layout.addWidget(self.pages_input, alignment=Qt.AlignLeft)
self.layout.addLayout(self.pages_layout)

# 设置按钮
self.start_button = QPushButton('开始并保存到Word')
self.start_button.clicked.connect(self.generate_and_save)
# 设置按钮的大小
button_size = QSize(400, 50)
self.layout = QVBoxLayout()

# 设置输入部分
self.settings_layout = QHBoxLayout()
self.questions_label = QLabel('题目数量')
self.questions_input = QLineEdit()
self.range_label = QLabel('运算范围')
self.range_input = QLineEdit()
self.settings_layout.addWidget(self.questions_label, alignment=Qt.AlignLeft)
self.settings_layout.addWidget(self.questions_input, alignment=Qt.AlignLeft)
self.settings_layout.addWidget(self.range_label, alignment=Qt.AlignLeft)
self.settings_layout.addWidget(self.range_input, alignment=Qt.AlignLeft)
self.layout.addLayout(self.settings_layout)

# 新增输入部分:选择生成的页数
self.pages_layout = QHBoxLayout()
self.pages_label = QLabel('生成页数')
self.pages_input = QLineEdit()
self.pages_layout.addWidget(self.pages_label, alignment=Qt.AlignLeft)
self.pages_layout.addWidget(self.pages_input, alignment=Qt.AlignLeft)
self.layout.addLayout(self.pages_layout)

# 设置按钮
self.start_button = QPushButton('开始并保存到Word')
self.start_button.clicked.connect(self.generate_and_save)
# 设置按钮的大小
button_size = QSize(400, 50) # 宽度为200,高度为50
self.start_button.setFixedSize(button_size)

self.layout.addWidget(self.start_button, alignment=Qt.AlignLeft)
self.setLayout(self.layout)

def generate_question(self, max_value):
while True:
# 随机选择哪两个数字是两位数
two_digit_places = random.sample([1, 2, 3], 2)
num1 = random.randint(10, max_value) if 1 in two_digit_places else random.randint(0, max_value)
num2 = random.randint(10, max_value) if 2 in two_digit_places else random.randint(0, max_value)
num3 = random.randint(10, max_value) if 3 in two_digit_places else random.randint(0, max_value)
operation1 = random.choice(['+', '-'])
operation2 = random.choice(['+', '-'])

first_step_result = eval(f"{num1} {operation1} {num2}")
if not 0 <= first_step_result <= max_value:
continue

final_result = eval(f"{first_step_result} {operation2} {num3}")
if 0 <= final_result <= max_value:
# 生成完整的题目
full_question = f"{num1} {operation1} {num2} {operation2} {num3} = {final_result}"

# 随机选择填空部分
parts = [str(num1), str(num2), str(num3), str(final_result)]
blank_part = random.choice(parts)

# 分割整个算式以确保替换完整数字
question_parts = full_question.split()
question_with_blank = ' '.join(["( )" if part == blank_part else part for part in question_parts])

# 确保只替换一次
if question_with_blank.count("( )") == 1:
return question_with_blank

def generate_and_save(self):
try:
max_value = int(self.range_input.text())
total_questions = int(self.questions_input.text())
pages = int(self.pages_input.text())
except ValueError:
print("请输入有效的数字")
return

# questions = [self.generate_question(max_value) for _ in range(total_questions)]

# 弹出文件保存对话框,设置默认文件名
all_questions = []
for _ in range(pages * total_questions):
all_questions.append(self.generate_question(max_value))

default_filename = f"{max_value}以内的加减混合运算_{datetime.datetime.now().strftime('%Y%m%d')}.docx"
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
filename, _ = QFileDialog.getSaveFileName(self, "保存文件", default_filename, "Word文档 (*.docx)", options=options)
if filename:
# 确保文件名以 .docx 结尾
if not filename.lower().endswith('.docx'):
filename += '.docx'
self.save_to_word(all_questions, max_value, filename, total_questions)

# 保存文件后退出应用程序
QApplication.instance().quit()

def save_to_word(self, all_questions, max_value, filename, total_questions):
doc = Document()
# 设置整体样式
style = doc.styles['Normal']
font = style.font
font.name = 'Times New Roman'
font.size = Pt(12)

for page in range(0, len(all_questions), total_questions):
if page != 0:
doc.add_page_break() # 在每个新页面之前添加分页

questions = all_questions[page:page + total_questions]
title = doc.add_heading(f'{max_value}以内的加减混合运算', level=1)
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
title.paragraph_format.space_after = Pt(24) # 增大标题下的空间

# 添加学生信息
student_info = doc.add_paragraph(
"班级__________ 姓名__________ 时间__________ 家长签字__________")
student_info.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
student_info.paragraph_format.space_after = Pt(24) # 增加段落间的空间

# 使用表格来整齐地排列题目,并设置每列的宽度
rows_needed = int(len(questions) / 3) + (1 if len(questions) % 3 > 0 else 0)
table = doc.add_table(rows=rows_needed, cols=3)
table.autofit = False
table.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
for col in table.columns:
col.width = Inches(2.5) # 设置每列的宽度,以填满页面

i = 0
for row in table.rows:
for cell in row.cells:
if i < len(questions):
cell.text = questions[i]
cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
i += 1

doc.save(filename)
print(f"文件已保存为: {filename}")


if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MathQuizApp()
ex.show()
sys.exit(app.exec_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值