自动出数学题软件v1.2 是一款可根据需要,自动出加减乘除数学题的软件。儿子上一年级了,之前在论坛也搜了一些出题软件,但是感觉总达不到自己的要求。于是找AI用python写了一个,我再略微修改了一下。源码附在后面,我是软件小白,本专业是学医的。正好11月份开始跟儿子一起自学python,电脑安装了python环境,就自己弄了一个。本来自己用的,想想还是发出来分享下,接受大家批评,也好继续进步。弄的那个exe绿色版本。
软件特点:
1. 可指定题目数字范围。
2. 可指定题目运算结果的范围。
3. 可指定题目数字的个数。
4. 加减乘除可以多选组合运算。
5. 可指定输出word每页的题目个数。
6. 可指定输出word题目的页数。
7. 除法做了限定,不会出现除不尽的情况。
8. 可设定显示答案,或不显示。
使用说明:
双击“自动出数学题1.2.exe”运行即可。输入参数后,点击“生成题目”,会在同目录下产生“数学题.docx”的文档,格式已经设置好,默认每页20题。直接打印即可。
软件界面,如下图:
生成的题目word文档:
源码如下:
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()
版权声明:本文内容均来源于互联网 如有侵权联系删除