使用Python實(shí)現(xiàn)小學(xué)生算術(shù)自動(dòng)出題工具
昨天加完班剛躺下,手機(jī)突然"叮咚"一聲。我瞇著眼劃開(kāi)屏幕,嫂子發(fā)來(lái)?xiàng)l59秒的語(yǔ)音:"花花啊,你侄子數(shù)學(xué)最近不好,計(jì)算題總出錯(cuò),想多練練,但每天手寫(xiě)出題太費(fèi)時(shí)間!從網(wǎng)上找的題目好多都要收費(fèi),我手抄了三天實(shí)在扛不住了,你們程序員不是會(huì)搞什么自動(dòng)化嗎?幫幫忙?。?quot;
為了挽救嫂子的家庭幸福,也出于對(duì)小侄子的關(guān)心,我回復(fù)了一個(gè)ok,抄起電腦就開(kāi)始噼里啪啦敲代碼...
代碼比想象中簡(jiǎn)單的多
效果圖
先給大伙看最終效果:
支持四種題型自由組合,自動(dòng)去重,還能導(dǎo)出帶答案的Word文檔,直接打印就能用。
實(shí)現(xiàn)思路
核心代碼其實(shí)就三大塊:
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é):
- 減法自動(dòng)交換數(shù)字避免負(fù)數(shù)(小學(xué)生還沒(méi)學(xué)負(fù)數(shù)呢?。?/li>
- 除法確保能整除
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é)生計(jì)算題.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') # 添加題目?jī)?nèi)容 for q in questions: p = doc.add_paragraph(q) p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT # 左對(duì)齊 # 插入一個(gè)新的頁(yè)面,用新節(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界面(假裝專(zhuān)業(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("輸入錯(cuò)誤", "請(qǐng)輸入有效的題目數(shù)量") # 創(chuàng)建主窗口 root = tk.Tk() root.title("小學(xué)生出題工具") root.geometry("400x350") root.config(bg="#f5f5f5") label_quantity = tk.Label(root, text="請(qǐng)輸入題目數(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="請(qǐng)選擇題目類(lèi)型:", 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è)計(jì)心得:
grid
布局比pack
更適合這種規(guī)整的界面- 默認(rèn)生成100道題目,小侄子看了更開(kāi)心
沒(méi)想到栽在這些小細(xì)節(jié)上
- 侄子說(shuō)除不盡的計(jì)算題看不懂
- 減法為什么有負(fù)數(shù),我們還沒(méi)學(xué)負(fù)數(shù)
- 乘號(hào)寫(xiě)成
*
,除號(hào)寫(xiě)成/
結(jié)果被侄子吐槽"和作業(yè)本長(zhǎng)得不一樣
最絕的是加了個(gè)一鍵導(dǎo)出答案,嫂子現(xiàn)在每天把題目和答案分開(kāi)打印,侄子做完自己核對(duì),徹底解放家長(zhǎng)!
到此這篇關(guān)于使用Python實(shí)現(xiàn)小學(xué)生算術(shù)自動(dòng)出題工具的文章就介紹到這了,更多相關(guān)Python自動(dòng)出題工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python常用的各種排序算法原理與實(shí)現(xiàn)方法小結(jié)
這篇文章主要介紹了python常用的各種排序算法原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了冒泡排序、插入排序、選擇排序、快速排序等排序算法的相關(guān)原理與實(shí)現(xiàn)方法,需要的朋友可以參考下2023-04-04Python二叉搜索樹(shù)與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法
這篇文章主要介紹了Python二叉搜索樹(shù)與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法,涉及Python二叉搜索樹(shù)的定義、實(shí)現(xiàn)以及雙向鏈表的轉(zhuǎn)換技巧,需要的朋友可以參考下2016-04-04Python爬蟲(chóng)之爬取最新更新的小說(shuō)網(wǎng)站
這篇文章主要介紹了Python爬蟲(chóng)之爬取最新更新的小說(shuō)網(wǎng)站,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲(chóng)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05詳解用python -m http.server搭一個(gè)簡(jiǎn)易的本地局域網(wǎng)
這篇文章主要介紹了詳解用python -m http.server搭一個(gè)簡(jiǎn)易的本地局域網(wǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09基于Python實(shí)現(xiàn)視頻分辨率轉(zhuǎn)換
這篇文章主要介紹了基于Python實(shí)現(xiàn)視頻的分辨率轉(zhuǎn)換的示例代碼,文中的代碼講解詳細(xì),對(duì)學(xué)習(xí)Python有一定的幫助,感興趣的小伙伴可以了解一下2021-12-12python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解內(nèi)容,需要的朋友們可以參考下。2020-08-08解決Pycharm在Debug的時(shí)候一直“Connected”沒(méi)有下一步動(dòng)作問(wèn)題
這篇文章主要介紹了解決Pycharm在Debug的時(shí)候一直“Connected”沒(méi)有下一步動(dòng)作問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08VSCode設(shè)置類(lèi)似Pycharm控制臺(tái)運(yùn)行Python顯示中間變量的步驟
這篇文章主要介紹了如何在VSCode中設(shè)置調(diào)試功能,以實(shí)現(xiàn)類(lèi)似于Pycharm在控制臺(tái)輸出中間變量的功能,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03用Python進(jìn)行柵格數(shù)據(jù)的分區(qū)統(tǒng)計(jì)和批量提取
該教程其實(shí)源于web,我看到之后覺(jué)得很實(shí)用,于是自己又重復(fù)做了一遍,寫(xiě)了詳細(xì)的注釋分享給大家,希望對(duì)大家的研究有幫助,本文講述了柵格的分區(qū)統(tǒng)計(jì),批量提取,深化理解遍歷循環(huán)等內(nèi)容2021-05-05