使用Python實現(xiàn)小學(xué)生算術(shù)自動出題工具
昨天加完班剛躺下,手機(jī)突然"叮咚"一聲。我瞇著眼劃開屏幕,嫂子發(fā)來條59秒的語音:"花花啊,你侄子數(shù)學(xué)最近不好,計算題總出錯,想多練練,但每天手寫出題太費(fèi)時間!從網(wǎng)上找的題目好多都要收費(fèi),我手抄了三天實在扛不住了,你們程序員不是會搞什么自動化嗎?幫幫忙啊!"
為了挽救嫂子的家庭幸福,也出于對小侄子的關(guān)心,我回復(fù)了一個ok,抄起電腦就開始噼里啪啦敲代碼...
代碼比想象中簡單的多
效果圖
先給大伙看最終效果:



支持四種題型自由組合,自動去重,還能導(dǎo)出帶答案的Word文檔,直接打印就能用。
實現(xiàn)思路
核心代碼其實就三大塊:
1. 題目生成器
def generate_question(selected_operations):
operators = selected_operations
num1 = random.randint(1, 100)
num2 = random.randint(1, 100)
operator = random.choice(operators)
# 確保生成的題目符合條件
if operator == '+':
return num1, operator, num2, num1 + num2
elif operator == '-':
while num2 > num1: # 保證減法不為負(fù)數(shù)
num1 ,num2 = num2 ,num1
return num1, operator, num2, num1 - num2
elif operator == '*':
return num1, '×', num2, num1 * num2
elif operator == '/':
num1 = random.randint(1, 100) * random.randint(1, 10) # 確保能整除
num2 = random.randint(1, 10)
return num1, '÷', num2, num1 // num2
# 生成題目的函數(shù)
def generate_questions(quantity, selected_operations):
questions = []
answers = []
for i in range(quantity):
num1, operator, num2, answer = generate_question(selected_operations)
question = f"{num1} {operator} {num2} = "
questions.append(question)
answers.append(f"{question} {answer}")
print(len(questions),len(answers))
return questions, answers
重點(diǎn)細(xì)節(jié):
- 減法自動交換數(shù)字避免負(fù)數(shù)(小學(xué)生還沒學(xué)負(fù)數(shù)呢!)
- 除法確保能整除
2. 把題目生成Word
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.section import WD_SECTION_START
def save_to_word(questions, answers, filename="小學(xué)生計算題.docx"):
doc = Document()
# 添加數(shù)學(xué)題目標(biāo)題
title = doc.add_heading('數(shù)學(xué)題目', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 插入"連續(xù)分節(jié)",設(shè)置4欄,題目區(qū)域都屬于這一節(jié)
section = doc.add_section(start_type=WD_SECTION_START.CONTINUOUS)
sectPr = section._sectPr
cols = sectPr.xpath('./w:cols')[0]
cols.set('num', '4')
# 添加題目內(nèi)容
for q in questions:
p = doc.add_paragraph(q)
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT # 左對齊
# 插入一個新的頁面,用新節(jié)保持正確格式
doc.add_page_break()
# 添加答案標(biāo)題
answer_title = doc.add_heading('答案', 0)
answer_title.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 插入新的"連續(xù)分節(jié)",設(shè)置4欄,答案區(qū)域也屬于這一節(jié)
section = doc.add_section(start_type=WD_SECTION_START.CONTINUOUS)
sectPr = section._sectPr
cols = sectPr.xpath('./w:cols')[0]
cols.set('num', '4')
# 添加答案內(nèi)容
for a in answers:
p = doc.add_paragraph(a)
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
doc.save(filename)
為了給嫂子節(jié)省打印前,這里用了Word的分欄功能,一行四道題目。
3. GUI界面(假裝專業(yè)的操作面板)
import tkinter as tk
from tkinter import messagebox
# GUI界面
def on_generate():
try:
quantity = int(entry_quantity.get())
selected_operations = []
if var_add.get():
selected_operations.append('+')
if var_sub.get():
selected_operations.append('-')
if var_mul.get():
selected_operations.append('*')
if var_div.get():
selected_operations.append('/')
if not selected_operations:
selected_operations = 'All'
questions, answers = generate_questions(quantity, selected_operations)
save_to_word(questions, answers)
except ValueError:
messagebox.showerror("輸入錯誤", "請輸入有效的題目數(shù)量")
# 創(chuàng)建主窗口
root = tk.Tk()
root.title("小學(xué)生出題工具")
root.geometry("400x350")
root.config(bg="#f5f5f5")
label_quantity = tk.Label(root, text="請輸入題目數(shù)量:", font=("微軟雅黑", 12), bg="#f5f5f5")
label_quantity.grid(row=0, column=0, padx=20, pady=10, sticky="w")
entry_quantity = tk.Entry(root, font=("微軟雅黑", 12), width=15)
entry_quantity.insert(0, "100")
entry_quantity.grid(row=0, column=1, padx=20, pady=10)
label_operations = tk.Label(root, text="請選擇題目類型:", font=("微軟雅黑", 12), bg="#f5f5f5")
label_operations.grid(row=1, column=0, padx=20, pady=10, sticky="w")
var_add = tk.BooleanVar()
var_sub = tk.BooleanVar()
var_mul = tk.BooleanVar()
var_div = tk.BooleanVar()
check_add = tk.Checkbutton(root, text="加法", variable=var_add, font=("微軟雅黑", 12))
check_add.grid(row=2, column=0, padx=20, sticky="w")
check_sub = tk.Checkbutton(root, text="減法", variable=var_sub, font=("微軟雅黑", 12))
check_sub.grid(row=3, column=0, padx=20, sticky="w")
check_mul = tk.Checkbutton(root, text="乘法", variable=var_mul, font=("微軟雅黑", 12))
check_mul.grid(row=4, column=0, padx=20, sticky="w")
check_div = tk.Checkbutton(root, text="除法", variable=var_div, font=("微軟雅黑", 12))
check_div.grid(row=5, column=0, padx=20, sticky="w")
button_generate = tk.Button(root, text="生成題目", command=on_generate, font=("微軟雅黑", 14), bg="#4CAF50", fg="white")
button_generate.grid(row=6, column=0, columnspan=2, pady=40)
root.mainloop()設(shè)計心得:
grid布局比pack更適合這種規(guī)整的界面- 默認(rèn)生成100道題目,小侄子看了更開心
沒想到栽在這些小細(xì)節(jié)上
- 侄子說除不盡的計算題看不懂
- 減法為什么有負(fù)數(shù),我們還沒學(xué)負(fù)數(shù)
- 乘號寫成
*,除號寫成/結(jié)果被侄子吐槽"和作業(yè)本長得不一樣
最絕的是加了個一鍵導(dǎo)出答案,嫂子現(xiàn)在每天把題目和答案分開打印,侄子做完自己核對,徹底解放家長!
到此這篇關(guān)于使用Python實現(xiàn)小學(xué)生算術(shù)自動出題工具的文章就介紹到這了,更多相關(guān)Python自動出題工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python常用的各種排序算法原理與實現(xiàn)方法小結(jié)
這篇文章主要介紹了python常用的各種排序算法原理與實現(xiàn)方法,結(jié)合實例形式總結(jié)分析了冒泡排序、插入排序、選擇排序、快速排序等排序算法的相關(guān)原理與實現(xiàn)方法,需要的朋友可以參考下2023-04-04
Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實現(xiàn)方法
這篇文章主要介紹了Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實現(xiàn)方法,涉及Python二叉搜索樹的定義、實現(xiàn)以及雙向鏈表的轉(zhuǎn)換技巧,需要的朋友可以參考下2016-04-04
詳解用python -m http.server搭一個簡易的本地局域網(wǎng)
這篇文章主要介紹了詳解用python -m http.server搭一個簡易的本地局域網(wǎng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
基于Python實現(xiàn)視頻分辨率轉(zhuǎn)換
這篇文章主要介紹了基于Python實現(xiàn)視頻的分辨率轉(zhuǎn)換的示例代碼,文中的代碼講解詳細(xì),對學(xué)習(xí)Python有一定的幫助,感興趣的小伙伴可以了解一下2021-12-12
解決Pycharm在Debug的時候一直“Connected”沒有下一步動作問題
這篇文章主要介紹了解決Pycharm在Debug的時候一直“Connected”沒有下一步動作問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
VSCode設(shè)置類似Pycharm控制臺運(yùn)行Python顯示中間變量的步驟
這篇文章主要介紹了如何在VSCode中設(shè)置調(diào)試功能,以實現(xiàn)類似于Pycharm在控制臺輸出中間變量的功能,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
用Python進(jìn)行柵格數(shù)據(jù)的分區(qū)統(tǒng)計和批量提取
該教程其實源于web,我看到之后覺得很實用,于是自己又重復(fù)做了一遍,寫了詳細(xì)的注釋分享給大家,希望對大家的研究有幫助,本文講述了柵格的分區(qū)統(tǒng)計,批量提取,深化理解遍歷循環(huán)等內(nèi)容2021-05-05

