切换到窄版

 找回密码
 点击文字激活账号
搜索
热搜: 活动 交友 discuz
扫描二维码关注官方公众号
查看: 51|回复: 0

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:427
  • 打卡月天数:5
  • 打卡总奖励:126977
  • 最近打卡:2025-02-05 08:28:56
  • TA的每日心情
    郁闷
    昨天 08:28
  • 签到天数: 427 天

    连续签到: 42 天

    [LV.9]以坛为家II

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

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

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

    1. import tkinter as tk
    2. from tkinter import messagebox, ttk
    3. import random
    4. from docx import Document
    5. from docx.shared import Pt
    6. from docx.enum.text import WD_LINE_SPACING
    7. from docx.oxml import OxmlElement
    8. from docx.oxml.ns import qn
    9. def generate_question(num_range, operations, num_count, result_range):
    10.     while True:
    11.         numbers = [random.randint(1, num_range) for _ in range(num_count)]
    12.         question = f"{numbers[0]}"
    13.         for i in range(1, num_count):
    14.             op = random.choice(operations)
    15.             question += f" {op} {numbers[i]}"
    16.         try:
    17.             result = eval(question)
    18.             # Check result range and avoid negative or decimal results
    19.             if result >= result_range[0] and result <= result_range[1] and result.is_integer():
    20.                 return question + f" = {int(result)}"
    21.         except ZeroDivisionError:
    22.             continue  # Ignore division by zero
    23. def set_two_columns(section):
    24.     """
    25.     通过直接操作 XML 元素来设置分栏为两栏(简易模拟方式)
    26.     """
    27.     sectPr = section._sectPr
    28.     cols = OxmlElement('w:cols')
    29.     cols.set(qn('w:num'), '2')  # 设置栏数为2
    30.     cols.set(qn('w:space'), '400')  # 设置栏间距(这里单位是缇,1磅 = 20缇,100缇大约相当于5磅间距,可按需调整)
    31.     sectPr.append(cols)
    32. def create_questions():
    33.     try:
    34.         num_range = int(entry_num_range.get())
    35.         num_count = int(entry_num_count.get())
    36.         result_min = int(entry_min_result.get())
    37.         result_max = int(entry_max_result.get())
    38.         questions_per_page = int(entry_questions_per_page.get())
    39.         output_pages = int(entry_output_pages.get())
    40.         show_answers = var_show_answers.get()
    41.         operations = []
    42.         if var_add.get():
    43.             operations.append('+')
    44.         if var_subtract.get():
    45.             operations.append('-')
    46.         if var_multiply.get():
    47.             operations.append('×')
    48.         if var_divide.get():
    49.             operations.append('÷')
    50.         if not operations:
    51.             messagebox.showwarning("警告", "请至少选择一个运算符!")
    52.             return
    53.         doc = Document()
    54.         # 设置文档整体字体格式(黑体、22号)
    55.         style = doc.styles['Normal']
    56.         font = style.font
    57.         font.name = '黑体'
    58.         font.size = Pt(22)
    59.         style.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    60.         # 设置段落格式(段前段后间距为0,行间距为2倍)
    61.         paragraph_format = style.paragraph_format
    62.         paragraph_format.space_before = Pt(0)
    63.         paragraph_format.space_after = Pt(0)
    64.         paragraph_format.line_spacing_rule = WD_LINE_SPACING.DOUBLE
    65.         # 设置分栏(两栏)
    66.         section = doc.sections[0]
    67.         set_two_columns(section)
    68.         # 获取标题样式并设置为和普通文本一样的格式
    69.         heading_style = doc.styles['Heading 1']
    70.         heading_font = heading_style.font
    71.         heading_font.name = '黑体'
    72.         heading_font.size = Pt(22)
    73.         heading_style.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    74.         heading_paragraph_format = heading_style.paragraph_format
    75.         heading_paragraph_format.space_before = Pt(0)
    76.         heading_paragraph_format.space_after = Pt(0)
    77.         heading_paragraph_format.line_spacing_rule = WD_LINE_SPACING.DOUBLE
    78.         for page in range(output_pages):
    79.             doc.add_heading(f'日期:________\n姓名:________', level=1)
    80.             for _ in range(questions_per_page):
    81.                 question = generate_question(num_range, operations, num_count, (result_min, result_max))
    82.                 if show_answers:
    83.                     doc.add_paragraph(question)  # 带有答案的题目
    84.                 else:
    85.                     doc.add_paragraph(question[:-2])  # 只添加题目,不包括等号和结果
    86.             # 添加分页符
    87.             if page < output_pages - 1:  # 避免添加最后一页的分页符
    88.                 doc.add_page_break()
    89.         doc.save("数学题.docx")
    90.         messagebox.showinfo("完成", "题目已成功生成并保存为‘数学题.docx’。")
    91.     except Exception as e:
    92.         messagebox.showerror("错误", str(e))

    93. # 创建主窗口
    94. root = tk.Tk()
    95. root.title("自动数学题生成器(by火星人&AI V1.2)")
    96. root.geometry("500x650")
    97. root.configure(bg="#f0f0f0")
    98. # 创建输入框和标签
    99. ttk.Label(root, text="题目数字大小范围 (1到):", background="#f0f0f0").pack(pady=5)
    100. entry_num_range = ttk.Entry(root)
    101. entry_num_range.insert(0, "10")  # 设置默认值为 10
    102. entry_num_range.pack(pady=5)
    103. ttk.Label(root, text="运算数字的个数:", background="#f0f0f0").pack(pady=5)
    104. entry_num_count = ttk.Entry(root)
    105. entry_num_count.insert(0, "3")  # 设置默认值为 3
    106. entry_num_count.pack(pady=5)
    107. ttk.Label(root, text="结果范围:(最小)", background="#f0f0f0").pack(pady=5)
    108. entry_min_result = ttk.Entry(root)
    109. entry_min_result.insert(0, "0")  # 设置默认值为 0
    110. entry_min_result.pack(pady=5)
    111. ttk.Label(root, text="结果范围:(最大)", background="#f0f0f0").pack(pady=5)
    112. entry_max_result = ttk.Entry(root)
    113. entry_max_result.insert(0, "10")  # 设置默认值为 10
    114. entry_max_result.pack(pady=5)
    115. # 运算选择
    116. var_add = tk.BooleanVar()
    117. var_add.set(True)  # 设置加法默认勾选
    118. var_subtract = tk.BooleanVar()
    119. var_subtract.set(True)  # 设置减法默认勾选
    120. var_multiply = tk.BooleanVar()
    121. var_divide = tk.BooleanVar()
    122. ttk.Checkbutton(root, text="加法 (+)", variable=var_add).pack(pady=5)
    123. ttk.Checkbutton(root, text="减法 (-)", variable=var_subtract).pack(pady=5)
    124. ttk.Checkbutton(root, text="乘法 (×)", variable=var_multiply).pack(pady=5)
    125. ttk.Checkbutton(root, text="除法 (÷)", variable=var_divide).pack(pady=5)
    126. # 显示答案选项
    127. var_show_answers = tk.BooleanVar()
    128. ttk.Checkbutton(root, text="显示答案", variable=var_show_answers).pack(pady=5)
    129. ttk.Label(root, text="每页题目数量(建议设为20):", background="#f0f0f0").pack(pady=5)
    130. entry_questions_per_page = ttk.Entry(root)
    131. entry_questions_per_page.insert(0, "20")  # 设置默认值为 20
    132. entry_questions_per_page.pack(pady=5)
    133. ttk.Label(root, text="输出页数:", background="#f0f0f0").pack(pady=5)
    134. entry_output_pages = ttk.Entry(root)
    135. entry_output_pages.insert(0, "30")  # 设置默认值为 30
    136. entry_output_pages.pack(pady=5)
    137. # 生成按钮
    138. btn_generate = ttk.Button(root, text="生成题目", command=create_questions)
    139. btn_generate.pack(pady=20)
    140. # 启动主循环
    141. root.mainloop()
    复制代码

    下载地址:
    > > 蓝盘下载:https://wwbt.lanzouv.com/i5ETY2hb70tc      密码:52pj


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?点击文字激活账号

    ×
    都是
    回复

    使用道具 举报

    *滑块验证:

    本版积分规则

    更多主题

    QQ|站点统计|Archiver|手机版|小黑屋|73327424 BBS ( 京ICP备05008343号|京公网安备11010602022017号 )
    免责声明:
    本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

    Mail To:3574358495@qq.com

    GMT+8, 2025-2-6 08:25 , Processed in 0.191288 second(s), 44 queries .

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表