趣幕网

自动出数学题软件 v1.2 绿色版 —— 数学出题工具

小编

自动出数学题软件v1.2  是一款可根据需要,自动出加减乘除数学题的软件。儿子上一年级了,之前在论坛也搜了一些出题软件,但是感觉总达不到自己的要求。于是找AI用python写了一个,我再略微修改了一下。源码附在后面,我是软件小白,本专业是学医的。正好11月份开始跟儿子一起自学python,电脑安装了python环境,就自己弄了一个。本来自己用的,想想还是发出来分享下,接受大家批评,也好继续进步。弄的那个exe绿色版本。


1. 可指定题目数字范围
2. 可指定题目运算结果的范围。
3. 可指定题目数字的个数
4. 加减乘除可以多选组合运算
5. 可指定输出word每页的题目个数。
6. 可指定输出word题目的页数
7. 除法做了限定,不会出现除不尽的情况。
8. 可设定显示答案,或不显示。

使
双击“自动出数学题1.2.exe运行即可。输入参数后,点击“生成题目”,会在同目录下产生“数学题.docx”的文档,格式已经设置好,默认每页20题。直接打印即可。
软件界面,如下图:

001.png

生成的题目word文档:

002.png

源码如下


import tkinter as tk
from tkinter import messagebox, ttk
import random
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_LINE_SPACING
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
def generate_question(num_range, operations, num_count, result_range):
    while True:
        numbers = [random.randint(1, num_range) for _ in range(num_count)]
        question = f"{numbers[0]}"
        for i in range(1, num_count):
            op = random.choice(operations)
            question += f" {op} {numbers[i]}"
        try:
            result = eval(question)
            # Check result range and avoid negative or decimal results
            if result >= result_range[0] and result <= result_range[1] and result.is_integer():
                return question + f" = {int(result)}"
        except ZeroDivisionError:
            continue  # Ignore division by zero
def set_two_columns(section):
    """
    通过直接操作 XML 元素来设置分栏为两栏(简易模拟方式)
    """
    sectPr = section._sectPr
    cols = OxmlElement('w:cols')
    cols.set(qn('w:num'), '2')  # 设置栏数为2
    cols.set(qn('w:space'), '400')  # 设置栏间距(这里单位是缇,1磅 = 20缇,100缇大约相当于5磅间距,可按需调整)
    sectPr.append(cols)
def create_questions():
    try:
        num_range = int(entry_num_range.get())
        num_count = int(entry_num_count.get())
        result_min = int(entry_min_result.get())
        result_max = int(entry_max_result.get())
        questions_per_page = int(entry_questions_per_page.get())
        output_pages = int(entry_output_pages.get())
        show_answers = var_show_answers.get()
        operations = []
        if var_add.get():
            operations.append('+')
        if var_subtract.get():
            operations.append('-')
        if var_multiply.get():
            operations.append('×')
        if var_divide.get():
            operations.append('÷')
        if not operations:
            messagebox.showwarning("警告", "请至少选择一个运算符!")
            return
        doc = Document()
        # 设置文档整体字体格式(黑体、22号)
        style = doc.styles['Normal']
        font = style.font
        font.name = '黑体'
        font.size = Pt(22)
        style.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
        # 设置段落格式(段前段后间距为0,行间距为2倍)
        paragraph_format = style.paragraph_format
        paragraph_format.space_before = Pt(0)
        paragraph_format.space_after = Pt(0)
        paragraph_format.line_spacing_rule = WD_LINE_SPACING.DOUBLE
        # 设置分栏(两栏)
        section = doc.sections[0]
        set_two_columns(section)
        # 获取标题样式并设置为和普通文本一样的格式
        heading_style = doc.styles['Heading 1']
        heading_font = heading_style.font
        heading_font.name = '黑体'
        heading_font.size = Pt(22)
        heading_style.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
        heading_paragraph_format = heading_style.paragraph_format
        heading_paragraph_format.space_before = Pt(0)
        heading_paragraph_format.space_after = Pt(0)
        heading_paragraph_format.line_spacing_rule = WD_LINE_SPACING.DOUBLE
        for page in range(output_pages):
            doc.add_heading(f'日期:________\n姓名:________', level=1)
            for _ in range(questions_per_page):
                question = generate_question(num_range, operations, num_count, (result_min, result_max))
                if show_answers:
                    doc.add_paragraph(question)  # 带有答案的题目
                else:
                    doc.add_paragraph(question[:-2])  # 只添加题目,不包括等号和结果
            # 添加分页符
            if page < output_pages - 1:  # 避免添加最后一页的分页符
                doc.add_page_break()
        doc.save("数学题.docx")
        messagebox.showinfo("完成", "题目已成功生成并保存为‘数学题.docx’。")
    except Exception as e:
        messagebox.showerror("错误", str(e))
 
# 创建主窗口
root = tk.Tk()
root.title("自动数学题生成器(by火星人&AI V1.2)")
root.geometry("500x650")
root.configure(bg="#f0f0f0")
# 创建输入框和标签
ttk.Label(root, text="题目数字大小范围 (1到):", background="#f0f0f0").pack(pady=5)
entry_num_range = ttk.Entry(root)
entry_num_range.insert(0, "10")  # 设置默认值为 10
entry_num_range.pack(pady=5)
ttk.Label(root, text="运算数字的个数:", background="#f0f0f0").pack(pady=5)
entry_num_count = ttk.Entry(root)
entry_num_count.insert(0, "3")  # 设置默认值为 3
entry_num_count.pack(pady=5)
ttk.Label(root, text="结果范围:(最小)", background="#f0f0f0").pack(pady=5)
entry_min_result = ttk.Entry(root)
entry_min_result.insert(0, "0")  # 设置默认值为 0
entry_min_result.pack(pady=5)
ttk.Label(root, text="结果范围:(最大)", background="#f0f0f0").pack(pady=5)
entry_max_result = ttk.Entry(root)
entry_max_result.insert(0, "10")  # 设置默认值为 10
entry_max_result.pack(pady=5)
# 运算选择
var_add = tk.BooleanVar()
var_add.set(True)  # 设置加法默认勾选
var_subtract = tk.BooleanVar()
var_subtract.set(True)  # 设置减法默认勾选
var_multiply = tk.BooleanVar()
var_divide = tk.BooleanVar()
ttk.Checkbutton(root, text="加法 (+)", variable=var_add).pack(pady=5)
ttk.Checkbutton(root, text="减法 (-)", variable=var_subtract).pack(pady=5)
ttk.Checkbutton(root, text="乘法 (×)", variable=var_multiply).pack(pady=5)
ttk.Checkbutton(root, text="除法 (÷)", variable=var_divide).pack(pady=5)
# 显示答案选项
var_show_answers = tk.BooleanVar()
ttk.Checkbutton(root, text="显示答案", variable=var_show_answers).pack(pady=5)
ttk.Label(root, text="每页题目数量(建议设为20):", background="#f0f0f0").pack(pady=5)
entry_questions_per_page = ttk.Entry(root)
entry_questions_per_page.insert(0, "20")  # 设置默认值为 20
entry_questions_per_page.pack(pady=5)
ttk.Label(root, text="输出页数:", background="#f0f0f0").pack(pady=5)
entry_output_pages = ttk.Entry(root)
entry_output_pages.insert(0, "30")  # 设置默认值为 30
entry_output_pages.pack(pady=5)
# 生成按钮
btn_generate = ttk.Button(root, text="生成题目", command=create_questions)
btn_generate.pack(pady=20)
# 启动主循环
root.mainloop()