使用Python实现小学生算术自动出题工具

 更新时间:2025年05月13日 09:47:12   作者:花小姐的春天  
这篇文章主要为大家详细介绍了使用Python实现小学生算术自动出题工具,支持四种题型自由组合,自动去重,还能导出带答案的Word文档,需要的可以了解下

昨天加完班刚躺下,手机突然"叮咚"一声。我眯着眼划开屏幕,嫂子发来条59秒的语音:"花花啊,你侄子数学最近不好,计算题总出错,想多练练,但每天手写出题太费时间!从网上找的题目好多都要收费,我手抄了三天实在扛不住了,你们程序员不是会搞什么自动化吗?帮帮忙啊!"

为了挽救嫂子的家庭幸福,也出于对小侄子的关心,我回复了一个ok,抄起电脑就开始噼里啪啦敲代码...

代码比想象中简单的多

效果图

先给大伙看最终效果:

支持四种题型自由组合,自动去重,还能导出带答案的Word文档,直接打印就能用。

实现思路

核心代码其实就三大块:

1. 题目生成器

def generate_question(selected_operations):
    operators = selected_operations
    num1 = random.randint(1, 100)
    num2 = random.randint(1, 100)
    operator = random.choice(operators)
    
    # 确保生成的题目符合条件
    if operator == '+':
        return num1, operator, num2, num1 + num2
    elif operator == '-':
        while num2 > num1:  # 保证减法不为负数
            num1 ,num2 = num2 ,num1
        return num1, operator, num2, num1 - num2
    elif operator == '*':
        return num1, '×', num2, num1 * num2
    elif operator == '/':
        num1 = random.randint(1, 100) * random.randint(1, 10)  # 确保能整除
        num2 = random.randint(1, 10)
        return num1, '÷', num2, num1 // num2

# 生成题目的函数
def generate_questions(quantity, selected_operations):
    questions = []
    answers = []
    
    for i in range(quantity):
        num1, operator, num2, answer = generate_question(selected_operations)
        question = f"{num1} {operator} {num2} = "
        questions.append(question)
        answers.append(f"{question} {answer}")
    print(len(questions),len(answers))
    return questions, answers

重点细节:

  • 减法自动交换数字避免负数(小学生还没学负数呢!)
  • 除法确保能整除

2. 把题目生成Word

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.section import WD_SECTION_START

def save_to_word(questions, answers, filename="小学生计算题.docx"):
    doc = Document()
    
    # 添加数学题目标题
    title = doc.add_heading('数学题目', 0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER

    # 插入"连续分节",设置4栏,题目区域都属于这一节
    section = doc.add_section(start_type=WD_SECTION_START.CONTINUOUS)
    sectPr = section._sectPr
    cols = sectPr.xpath('./w:cols')[0]
    cols.set('num', '4')

    # 添加题目内容
    for q in questions:
        p = doc.add_paragraph(q)
        p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT  # 左对齐

    # 插入一个新的页面,用新节保持正确格式
    doc.add_page_break()

    # 添加答案标题
    answer_title = doc.add_heading('答案', 0)
    answer_title.alignment = WD_ALIGN_PARAGRAPH.CENTER

    # 插入新的"连续分节",设置4栏,答案区域也属于这一节
    section = doc.add_section(start_type=WD_SECTION_START.CONTINUOUS)
    sectPr = section._sectPr
    cols = sectPr.xpath('./w:cols')[0]
    cols.set('num', '4')

    # 添加答案内容
    for a in answers:
        p = doc.add_paragraph(a)
        p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT

    doc.save(filename)

为了给嫂子节省打印前,这里用了Word的分栏功能,一行四道题目。

3. GUI界面(假装专业的操作面板)

import tkinter as tk
from tkinter import messagebox

# GUI界面
def on_generate():
    try:
        quantity = int(entry_quantity.get())
        selected_operations = []
        
        if var_add.get():
            selected_operations.append('+')
        if var_sub.get():
            selected_operations.append('-')
        if var_mul.get():
            selected_operations.append('*')
        if var_div.get():
            selected_operations.append('/')
        
        if not selected_operations:
            selected_operations = 'All'
        
        questions, answers = generate_questions(quantity, selected_operations)
        save_to_word(questions, answers)
        
    except ValueError:
        messagebox.showerror("输入错误", "请输入有效的题目数量")

# 创建主窗口
root = tk.Tk()
root.title("小学生出题工具")
root.geometry("400x350")  
root.config(bg="#f5f5f5")  

label_quantity = tk.Label(root, text="请输入题目数量:", font=("微软雅黑", 12), bg="#f5f5f5")
label_quantity.grid(row=0, column=0, padx=20, pady=10, sticky="w")

entry_quantity = tk.Entry(root, font=("微软雅黑", 12), width=15)
entry_quantity.insert(0, "100")
entry_quantity.grid(row=0, column=1, padx=20, pady=10)

label_operations = tk.Label(root, text="请选择题目类型:", font=("微软雅黑", 12), bg="#f5f5f5")
label_operations.grid(row=1, column=0, padx=20, pady=10, sticky="w")

var_add = tk.BooleanVar()
var_sub = tk.BooleanVar()
var_mul = tk.BooleanVar()
var_div = tk.BooleanVar()

check_add = tk.Checkbutton(root, text="加法", variable=var_add, font=("微软雅黑", 12))
check_add.grid(row=2, column=0, padx=20, sticky="w")

check_sub = tk.Checkbutton(root, text="减法", variable=var_sub, font=("微软雅黑", 12))
check_sub.grid(row=3, column=0, padx=20, sticky="w")

check_mul = tk.Checkbutton(root, text="乘法", variable=var_mul, font=("微软雅黑", 12))
check_mul.grid(row=4, column=0, padx=20, sticky="w")

check_div = tk.Checkbutton(root, text="除法", variable=var_div, font=("微软雅黑", 12))
check_div.grid(row=5, column=0, padx=20, sticky="w")

button_generate = tk.Button(root, text="生成题目", command=on_generate, font=("微软雅黑", 14), bg="#4CAF50", fg="white")
button_generate.grid(row=6, column=0, columnspan=2, pady=40)

root.mainloop()

设计心得:

  • grid布局比pack更适合这种规整的界面
  • 默认生成100道题目,小侄子看了更开心

没想到栽在这些小细节上

  • 侄子说除不尽的计算题看不懂
  • 减法为什么有负数,我们还没学负数
  • 乘号写成*,除号写成/结果被侄子吐槽"和作业本长得不一样

最绝的是加了个一键导出答案,嫂子现在每天把题目和答案分开打印,侄子做完自己核对,彻底解放家长!

到此这篇关于使用Python实现小学生算术自动出题工具的文章就介绍到这了,更多相关Python自动出题工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python常用的各种排序算法原理与实现方法小结

    python常用的各种排序算法原理与实现方法小结

    这篇文章主要介绍了python常用的各种排序算法原理与实现方法,结合实例形式总结分析了冒泡排序、插入排序、选择排序、快速排序等排序算法的相关原理与实现方法,需要的朋友可以参考下
    2023-04-04
  • Python二叉搜索树与双向链表转换实现方法

    Python二叉搜索树与双向链表转换实现方法

    这篇文章主要介绍了Python二叉搜索树与双向链表转换实现方法,涉及Python二叉搜索树的定义、实现以及双向链表的转换技巧,需要的朋友可以参考下
    2016-04-04
  • Python爬虫之爬取最新更新的小说网站

    Python爬虫之爬取最新更新的小说网站

    这篇文章主要介绍了Python爬虫之爬取最新更新的小说网站,文中有非常详细的代码示例,对正在学习python爬虫的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 详解用python -m http.server搭一个简易的本地局域网

    详解用python -m http.server搭一个简易的本地局域网

    这篇文章主要介绍了详解用python -m http.server搭一个简易的本地局域网,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 基于Python实现视频分辨率转换

    基于Python实现视频分辨率转换

    这篇文章主要介绍了基于Python实现视频的分辨率转换的示例代码,文中的代码讲解详细,对学习Python有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12
  • python实现梯度下降算法的实例详解

    python实现梯度下降算法的实例详解

    在本篇文章里小编给大家整理的是一篇关于python实现梯度下降算法的实例详解内容,需要的朋友们可以参考下。
    2020-08-08
  • 解决Pycharm在Debug的时候一直“Connected”没有下一步动作问题

    解决Pycharm在Debug的时候一直“Connected”没有下一步动作问题

    这篇文章主要介绍了解决Pycharm在Debug的时候一直“Connected”没有下一步动作问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python发送邮件脚本

    python发送邮件脚本

    这篇文章主要为大家详细介绍了发送邮件python脚本,支持多个附件,中文,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • VSCode设置类似Pycharm控制台运行Python显示中间变量的步骤

    VSCode设置类似Pycharm控制台运行Python显示中间变量的步骤

    这篇文章主要介绍了如何在VSCode中设置调试功能,以实现类似于Pycharm在控制台输出中间变量的功能,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • 用Python进行栅格数据的分区统计和批量提取

    用Python进行栅格数据的分区统计和批量提取

    该教程其实源于web,我看到之后觉得很实用,于是自己又重复做了一遍,写了详细的注释分享给大家,希望对大家的研究有帮助,本文讲述了栅格的分区统计,批量提取,深化理解遍历循环等内容
    2021-05-05

最新评论