- 打卡等级:以坛为家II
- 打卡总天数:427
- 打卡月天数:5
- 打卡总奖励:126977
- 最近打卡:2025-02-05 08:28:56
TA的每日心情 | 郁闷 昨天 08:28 |
---|
签到天数: 427 天 连续签到: 42 天 [LV.9]以坛为家II
|
自动出数学题软件v1.2 是一款可根据需要,自动出加减乘除数学题的软件。儿子上一年级了,之前在论坛也搜了一些出题软件,但是感觉总达不到自己的要求。于是找AI用python写了一个,我再略微修改了一下。源码附在后面,我是软件小白,本专业是学医的。正好11月份开始跟儿子一起自学python,电脑安装了python环境,就自己弄了一个。本来自己用的,想想还是发出来分享下,接受大家批评,也好继续进步。弄的那个exe绿色版本。
软件特点:
1. 可指定题目数字范围。
2. 可指定题目运算结果的范围。
3. 可指定题目数字的个数。
4. 加减乘除可以多选组合运算。
5. 可指定输出word每页的题目个数。
6. 可指定输出word题目的页数。
7. 除法做了限定,不会出现除不尽的情况。
8. 可设定显示答案,或不显示。
使用说明:
双击“自动出数学题1.2.exe”运行即可。输入参数后,点击“生成题目”,会在同目录下产生“数学题.docx”的文档,格式已经设置好,默认每页20题。直接打印即可。
软件界面,如下图:
- 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()
复制代码
下载地址:
> > 蓝盘下载:https://wwbt.lanzouv.com/i5ETY2hb70tc 密码:52pj
|
|