基于Python開發(fā)一個選擇題訓(xùn)練工具
一、引言
隨著人工智能技術(shù)的不斷進步,傳統(tǒng)的教學(xué)方式已經(jīng)逐漸向智能化、互動化轉(zhuǎn)變。在眾多英語測試題型中,選擇題作為一種高效的方式被廣泛應(yīng)用于各類培訓(xùn)與考試中。為了幫助學(xué)生高效學(xué)習(xí)與自測,本篇文章將采用Python編寫一款基于 Python 開發(fā)的選擇題訓(xùn)練工具。該工具不僅支持加載 Excel 文件中的題庫,還具備題干和選項展示、答題記錄、音頻朗讀等多種功能,旨在為用戶提供便捷、高效的學(xué)習(xí)體驗。
二、開發(fā)背景
在日常教學(xué)過程中,老師往往需要準備大量的選擇題作為測試題目。我們可以把這些題目存儲在 Excel 文件中,如果手動處理和展示題目會非常繁瑣。為了提高教學(xué)效率,選用一種自動化展示工具成為一種迫切的需求。本項目通過 Python 和 Tkinter 庫實現(xiàn)了一個圖形化界面應(yīng)用,可以自動加載并展示選擇題,記錄用戶答題情況,同時通過音頻朗讀題目,進一步增強互動性。軟件的示意圖如下:
軟件展示
三、軟件特點
題庫加載與展示:支持從 Excel 文件中加載選擇題,并且可以根據(jù)課程單元名稱篩選題目。
音頻朗讀功能:使用 Python 的 Pygame 庫播放題目音頻,即朗讀題干,幫助用戶通過聽力鞏固已學(xué)單詞。
答題記錄與統(tǒng)計:軟件會自動記錄用戶的答題情況,并在決定答題結(jié)束時,提供正確率和錯誤題目的回顧功能。
多線程支持:使用線程處理音頻播放等耗時操作,避免界面卡頓,提升用戶體驗。同時,當(dāng)完成一道題時,會自動轉(zhuǎn)到下一道,并給出正確或錯誤的提示。正確就是顯示綠色的button選項,錯誤就顯示紅色的button選項。
圖形化界面:基于 Tkinter 實現(xiàn)的 GUI 界面,簡單直觀,易于操作。
四、使用方法
1. 安裝依賴
在運行程序之前,需要安裝一些 Python 庫,依賴包括 openpyxl, pygame 和 requests??梢允褂靡韵旅畎惭b所需的庫:
pip install openpyxl pygame requests
2. 準備題庫
本程序需要一個 Excel 文件,并命名為【選擇題.xlsx】作為題庫,Excel 文件應(yīng)包括如下列:
單元:課程名稱或章節(jié)
序號:題目的編號
題干:選擇題的內(nèi)容
選項A、B、C、D:四個選擇項
正確答案:正確的答案選項
Excel表的內(nèi)容如下:
Excel表內(nèi)容
3. 運行程序
運行 Python 程序,tkinter GUI界面會自動加載,用戶可以在頂部下拉框選擇不同的課程,然后開始答題,結(jié)束前查看戰(zhàn)績,回顧錯誤題目,還可以點朗讀通過音頻功能聽題干。
4. 功能概覽
選擇題顯示:在每道題目顯示時,用戶可以選擇答案。程序會自動判斷正確與否,并高亮顯示選擇的答案。
戰(zhàn)績統(tǒng)計:用戶答題完成后,可以查看自己的正確率統(tǒng)計。
錯誤回顧:用戶可以查看答錯的題目,并且看到正確答案與自己的選擇。
朗讀功能:用戶可以點擊按鈕讓程序朗讀題干。
五、源碼展示
以下是該程序的主要代碼:
import tkinter as tk from tkinter import ttk, messagebox from openpyxl import load_workbook import random import os,re import pygame,requests from io import BytesIO from threading import Lock, Thread, Timer def load_excel_data(filename): workbook = load_workbook(filename) sheet = workbook.active questions = [] lessons = set() # 用于存儲所有課程名,避免重復(fù) for row in sheet.iter_rows(min_row=2, values_only=True): lesson = row[0] lessons.add(lesson) question = { '單元': lesson, '序號': row[1], '題干': row[2], '選項': [row[3], row[4], row[5], row[6]], '正確答案': row[7] } questions.append(question) return list(lessons), questions lessons, questions = load_excel_data('選擇題.xlsx') random.shuffle(questions) # 使用正則表達式從課程名中提取數(shù)字,并按數(shù)字排序課程名 sorted_lessons = sorted(lessons, key=lambda x: (lambda m: int(m.group(0)) if m else 0)(re.search(r'\d+', x))) class QuizApp: def __init__(self, root): self.root = root # 設(shè)置窗口大小 self.root.geometry("600x500") #self.root.resizable(False, False) pygame.init() self.all_questions = questions self.questions = questions # 當(dāng)前顯示的問題列表 self.current_question_index = 0 self.correct_answers = 0 self.wrong_answers = 0 self.error_questions = [] self.setup_ui() self.load_question() def thread_it(self,func): self.thread1=Thread(target=func) self.thread1.setDaemon(True) self.thread1.start() def setup_ui(self): self.root.title("選擇題訓(xùn)練工具") self.lesson_combobox = ttk.Combobox(self.root, values=['全部'] + sorted_lessons, state="readonly") self.lesson_combobox.pack(pady=(10, 0)) self.lesson_combobox.set('全部') self.lesson_combobox.bind('<<ComboboxSelected>>', self.on_combobox_change) self.question_label = tk.Label(self.root, text="", font=("Times New Roman", 20), fg="blue", wraplength=520, justify=tk.LEFT) #設(shè)置文本長度,并且文本左對齊 self.question_label.pack(pady=(10, 40)) self.options_frame = tk.Frame(self.root) self.options_frame.pack(pady=20) option_labels = ['A', 'B', 'C', 'D'] # 選項標簽 self.option_buttons = [] # 存儲選項按鈕 self.option_labels = [] # 存儲選項標簽控件 for i in range(4): # 創(chuàng)建選項標簽控件并放置 label = tk.Label(self.options_frame, text=f"{option_labels[i]}.", font=("Times New Roman", 16)) label.grid(row=i, column=0, pady=5, sticky="e") self.option_labels.append(label) # 創(chuàng)建選項按鈕并放置 btn = tk.Button(self.options_frame, text="", font=("Times New Roman", 16), width=20, command=lambda b=i: self.check_answer(b), # type: ignore anchor="w") btn.grid(row=i, column=1, pady=5) self.option_buttons.append(btn) self.action_frame = tk.Frame(self.root) self.action_frame.pack(side=tk.BOTTOM, pady=20) tk.Button(self.action_frame, text="退出程序", font=("宋體", 16, "bold"), width=9, command=self.ui_quit).pack(side=tk.LEFT, padx=10) tk.Button(self.action_frame, text="我的戰(zhàn)績", font=("宋體", 16, "bold"), width=9, command=self.show_score).pack(side=tk.LEFT, padx=10) tk.Button(self.action_frame, text="查看錯誤", font=("宋體", 16, "bold"), width=9, command=self.show_errors).pack(side=tk.LEFT, padx=10) tk.Button(self.action_frame, text="朗讀題干", font=("宋體", 16, "bold"), width=9, command=self.show_sound).pack(side=tk.LEFT, padx=10)# 其余UI代碼與原來相同... def on_combobox_change(self, event): selected_lesson = self.lesson_combobox.get() if selected_lesson == '全部': self.questions = self.all_questions else: self.questions = [q for q in self.all_questions if q['單元'] == selected_lesson] self.current_question_index = 0 self.correct_answers = 0 self.wrong_answers = 0 self.error_questions = [] self.load_question() def load_question(self): if self.current_question_index < len(self.questions): question = self.questions[self.current_question_index] self.question_label.config(text=str(self.current_question_index+1)+". "+question['題干'],anchor='w') correct_answer = question['正確答案'] options = question['選項'] self.correct_option_index = options.index(correct_answer) random.shuffle(options) for i, option in enumerate(options): self.option_buttons[i].config(text=option, bg='SystemButtonFace') def check_answer(self, button_index): question = self.questions[self.current_question_index] selected_option = self.option_buttons[button_index].cget('text') correct_option = question['正確答案'] # 確定正確答案按鈕的索引 correct_option_index = None for i, btn in enumerate(self.option_buttons): if btn.cget('text') == correct_option: correct_option_index = i break if selected_option == correct_option: # 用戶選擇了正確的答案 self.option_buttons[button_index].config(bg='light green') self.correct_answers += 1 else: # 用戶選擇了錯誤的答案 self.option_buttons[button_index].config(bg='red') if correct_option_index is not None: self.option_buttons[correct_option_index].config(bg='light green') self.wrong_answers += 1 self.error_questions.append((question['題干'], selected_option, question['正確答案'])) # 準備間隔1秒顯示下一個問題 self.root.after(1000, self.next_question) def next_question(self): self.current_question_index += 1 if self.current_question_index < len(self.questions): self.load_question() else: messagebox.showinfo("結(jié)束", "所有問題都已回答完畢!") def ui_quit(self): self.root.destroy() def show_score(self): messagebox.showinfo("戰(zhàn)績", f"正確: {self.correct_answers}\n錯誤: {self.wrong_answers}\n總計: {len(self.questions)}\n正確率:{self.correct_answers/len(self.questions)*100}%") def show_sound(self): self.thread_it(self.show_sound2) def show_errors(self): error_messages = "\n".join([f"題干: {q[0]},正確答案是:{q[2]}, 您的選擇: {q[1]}" for q in self.error_questions]) messagebox.showinfo("錯誤回顧", error_messages if error_messages else "完美!沒有任何錯誤。") def show_sound2(self): self.current_name = self.question_label.cget("text") audio_path = f"https://dict.youdao.com/dictvoice?audio={self.current_name}&type=1" resp = requests.get(audio_path) audio_data = BytesIO(resp.content) pygame.mixer.music.load(audio_data) pygame.mixer.music.play() while pygame.mixer.music.get_busy(): continue # 退出pygame if __name__ == "__main__": root = tk.Tk() app = QuizApp(root) root.mainloop()
六、注意事項
Excel 文件格式:確保題庫文件【選擇題.xlsx】的格式正確,每個問題必須包含單元、序號、題干、選項和正確答案等字段。
音頻播放:程序中使用了 Pygame 庫進行音頻播放,因此需要安裝相應(yīng)的音頻庫,并且程序會訪問在線字典接口生成題目音頻。
線程管理:為了避免界面卡頓,音頻播放等操作被放置在單獨的線程中處理,保證主界面的流暢性。
數(shù)據(jù)存儲:答題結(jié)果和錯誤回顧會暫時保存在程序內(nèi)存中,但如果需要長期保存數(shù)據(jù),可以考慮添加導(dǎo)出功能。
七、總結(jié)
這款選擇題訓(xùn)練工具通過 Python 實現(xiàn)了一個簡單易用的答題系統(tǒng),利用 Tkinter 提供了良好的用戶界面,結(jié)合 Pygame 和音頻播放技術(shù),增強了選擇題問答的互動性。它可以幫助學(xué)生提高學(xué)習(xí)效率,幫助教師管理題庫,并提供了直觀的成績統(tǒng)計與錯誤回顧功能,是一款非常實用的教學(xué)輔助工具。
到此這篇關(guān)于基于Python開發(fā)一個選擇題訓(xùn)練工具的文章就介紹到這了,更多相關(guān)Python選擇題訓(xùn)練工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python利用random生成一個列表內(nèi)的隨機數(shù)
這篇文章主要介紹了詳解Python利用random生成一個列表內(nèi)的隨機數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細介紹了TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Python使用django框架實現(xiàn)多人在線匿名聊天的小程序
很多網(wǎng)站都提供了在線匿名聊天的小功能,下面小編基于python的django框架實現(xiàn)一個多人在線匿名聊天的小程序,具體實現(xiàn)代碼大家參考下本文2017-11-11python實戰(zhàn)練習(xí)做一個隨機點名的程序
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python實現(xiàn)一個隨機點名的程序,大家可以在過程中查缺補漏,提升水平2021-10-10python+mysql實現(xiàn)教務(wù)管理系統(tǒng)
這篇文章主要為大家詳細介紹了python+mysql實現(xiàn)教務(wù)管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02