自动出数学题软件v1.2 是一款可根据需要,自动出加减乘除数学题的软件。
软件特点:
1. 可指定题目数字范围。
2. 可指定题目运算结果的范围。
3. 可指定题目数字的个数。
4. 加减乘除可以多选组合运算。
5. 可指定输出word每页的题目个数。
6. 可指定输出word题目的页数。
7. 除法做了限定,不会出现除不尽的情况。
8. 可设定显示答案,或不显示。
使用说明:
双击“自动出数学题1.2.exe”运行即可。输入参数后,点击“生成题目”,会在同目录下产生“数学题.docx”的文档,格式已经设置好,默认每页20题。直接打印即可。
软件界面,如下图:
下载地址:
[Python]源码如下:
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()
评论(0)