基于Python編寫(xiě)一個(gè)單詞自測(cè)程序
更新時(shí)間:2024年12月13日 10:41:41 作者:抱抱你養(yǎng)的貓231
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫(xiě)一個(gè)單詞自測(cè)程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
直接上最終版本!
此程序需要配合單詞本使用,單詞本格式為txt(單詞 翻譯),附考研英語(yǔ)單詞本(完整版關(guān)注我,私信領(lǐng)取)
程序打包為exe的教程:
import wx import random class VocabularyAssistant: def __init__(self, file_path): # 初始化 VocabularyAssistant 類的實(shí)例。 # 單詞本文件的路徑。 self.file_path = file_path # 包含單詞和對(duì)應(yīng)翻譯的列表。 self.words = [] # 當(dāng)前隨機(jī)選擇的單詞和翻譯,格式為 (word, translation)。 self.current_word = None # 存儲(chǔ)已經(jīng)出現(xiàn)過(guò)的單詞。 self.used_words = set() # 存儲(chǔ)已經(jīng)訪問(wèn)過(guò)的單詞的索引。 self.visited_words = set() def refresh_words(self): # 刷新單詞列表,重新加載單詞本文件中的單詞。 # 加載單詞本文件中的單詞。 self.words = self.load_words() def load_words(self): # 從文件中加載單詞列表。 words = [] # 存儲(chǔ)單詞和翻譯的列表 if self.file_path: try: with open(self.file_path, 'r', encoding='utf-8') as file: # 逐行讀取文件內(nèi)容,并解析為單詞和翻譯的列表。 lines = file.readlines() words = [line.strip().split() for line in lines] except FileNotFoundError: print(f"找不到文件:{self.file_path}") return words def set_file_path(self, file_path): # 設(shè)置單詞本文件的路徑,并刷新單詞列表。 self.file_path = file_path self.refresh_words() # 刷新單詞列表 def get_random_word(self): # 如果所有單詞都被訪問(wèn)過(guò),重新加載單詞列表 if len(self.visited_words) == len(self.words): self.visited_words.clear() # 清空已訪問(wèn)單詞記錄 self.refresh_words() # 重新加載單詞列表 wx.MessageBox("已開(kāi)始新一輪!", "提示", wx.OK | wx.ICON_INFORMATION) # 隨機(jī)選擇未訪問(wèn)過(guò)的單詞 remaining_words = set(range(len(self.words))) - self.visited_words if not remaining_words: wx.MessageBox("已開(kāi)始新一輪!", "提示", wx.OK | wx.ICON_INFORMATION) self.visited_words.clear() # 清空已訪問(wèn)單詞記錄 remaining_words = set(range(len(self.words))) random_index = random.choice(list(remaining_words)) self.current_word = self.words[random_index] self.visited_words.add(random_index) return self.current_word[0], len(self.visited_words), len(self.words) def get_translation(self): # 獲取當(dāng)前單詞的翻譯。 if self.current_word: # 返回翻譯部分 translation = self.current_word[1] if len(self.current_word) > 1 else "未提供翻譯" return translation else: return "請(qǐng)先獲取一個(gè)單詞" def query_word(self, word): # 查詢指定單詞的翻譯。 for item in self.words: if len(item) == 2: # 檢查元素是否具有兩個(gè)值 w, translation = item if w.lower() == word.lower(): return f"{w}: {translation}" return f"找不到單詞:{word}" def modify_word(self, word_to_modify, new_translation): # 修改指定單詞的翻譯。 for i, item in enumerate(self.words): if len(item) == 2: # 檢查元素是否具有兩個(gè)值 word, translation = item if word.lower() == word_to_modify.lower(): self.words[i][1] = new_translation self.save_words() # 保存修改后的單詞表 return True return False def save_words(self): # 將單詞表保存到文件中。 with open(self.file_path, 'w', encoding='utf-8') as file: for item in self.words: if len(item) == 2: # 檢查元素是否具有兩個(gè)值 word, translation = item file.write(f"{word} {translation}\n") def add_to_stranger_list(self, word, translation): # 將單詞和翻譯添加到陌生單詞本。 with open("D:\陌生單詞本.txt", 'a', encoding='utf-8') as file: file.write(f"{word} {translation}\n") def remove_from_stranger_list(self, word): # 從陌生單詞本中移除指定單詞。 # 構(gòu)建陌生單詞表文件路徑 stranger_list_path = "D:\陌生單詞本.txt" # 讀取陌生單詞表文件內(nèi)容 with open(stranger_list_path, 'r', encoding='utf-8') as file: lines = file.readlines() # 將不是當(dāng)前單詞的內(nèi)容重新寫(xiě)入文件 with open(stranger_list_path, 'w', encoding='utf-8') as file: for line in lines: if not line.startswith(f"{word} "): # 不是當(dāng)前單詞的行寫(xiě)回文件 file.write(line) # 返回陌生單詞表文件的內(nèi)容 return lines def get_words(self): # 返回當(dāng)前單詞列表。 return self.words class VocabularyApp(wx.App): def OnInit(self): # 初始化應(yīng)用程序,創(chuàng)建主窗口并顯示 self.frame = VocabularyFrame(None, title='單詞自測(cè)V4.1.2', size=(500, 600)) self.SetTopWindow(self.frame) self.frame.Show() return True class VocabularyFrame(wx.Frame): def __init__(self, *args, **kw): super(VocabularyFrame, self).__init__(*args, **kw) # VocabularyAssistant實(shí)例化時(shí)不需要初始文件路徑 self.assistant = VocabularyAssistant('') # 創(chuàng)建菜單欄 menu_bar = wx.MenuBar() # 創(chuàng)建“文件”菜單 file_menu = wx.Menu() menu_bar.Append(file_menu, "&文件") # 添加選擇單詞本文件的菜單項(xiàng) select_vocabulary_item = file_menu.Append(wx.ID_ANY, "&選擇單詞本文件", "選擇單詞本文件") self.Bind(wx.EVT_MENU, self.on_file_select, select_vocabulary_item) # 創(chuàng)建“幫助”菜單 help_menu = wx.Menu() menu_bar.Append(help_menu, "&幫助") # 添加“使用說(shuō)明”菜單項(xiàng) shuoming_item = help_menu.Append(wx.ID_ANY, "&使用說(shuō)明", "關(guān)于程序的使用說(shuō)明") self.Bind(wx.EVT_MENU, self.on_shuoming, shuoming_item) # 創(chuàng)建“關(guān)于”菜單 about_menu = wx.Menu() menu_bar.Append(about_menu, "&關(guān)于") # 創(chuàng)建關(guān)于作者子菜單 about_author_submenu = wx.Menu() contact_item = about_author_submenu.Append(wx.ID_ANY, "&聯(lián)系方式", "顯示作者的聯(lián)系方式") self.Bind(wx.EVT_MENU, self.on_phone_and_qq, contact_item) about_menu.AppendSubMenu(about_author_submenu, "&關(guān)于作者") # 添加“關(guān)于程序”菜單項(xiàng) about_item = about_menu.Append(wx.ID_ABOUT, "&關(guān)于程序", "關(guān)于該程序的信息") self.Bind(wx.EVT_MENU, self.on_about, about_item) # 添加“版本信息”菜單項(xiàng) version_item = about_menu.Append(wx.ID_ANY, "&版本信息", "關(guān)于該程序版本的信息") self.Bind(wx.EVT_MENU, self.on_version, version_item) # 添加“致謝”菜單項(xiàng) thanks_item = about_menu.Append(wx.ID_ANY, "&致謝", "關(guān)于該程序版本的信息") self.Bind(wx.EVT_MENU, self.on_thanks, thanks_item) # 設(shè)置菜單欄 self.SetMenuBar(menu_bar) # 創(chuàng)建面板和控件 panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) # 創(chuàng)建并添加控件 self.current_file_label = wx.StaticText(panel, label="當(dāng)前單詞本:") self.set_font(self.current_file_label, 12) sizer.Add(self.current_file_label, 0, wx.ALL | wx.ALIGN_LEFT, 5) self.show_toggle_button = wx.Button(panel, label="獲取單詞", size=(150, 35)) self.show_toggle_button.Bind(wx.EVT_BUTTON, self.on_toggle_button) self.set_font(self.show_toggle_button, 22) sizer.Add(self.show_toggle_button, 0, wx.ALL | wx.CENTER, 5) self.word_label = wx.StaticText(panel, label=" ") self.set_font(self.word_label, 25) sizer.Add(self.word_label, 0, wx.ALIGN_CENTER | wx.ALL, 5) self.progress_label = wx.StaticText(panel, label=" ", style=wx.ALIGN_CENTER) self.set_font(self.progress_label, 14) sizer.Add(self.progress_label, 0, wx.ALIGN_CENTER | wx.ALL, 5) horizontal_sizer = wx.BoxSizer(wx.HORIZONTAL) self.translation_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_CENTER, size=(200, 300)) self.set_font(self.translation_text, 22) horizontal_sizer.Add(self.translation_text, 1, wx.ALL | wx.EXPAND, 5) sizer.Add(horizontal_sizer, 1, wx.ALL | wx.EXPAND, 5) self.add_to_stranger_button = wx.Button(panel, label="陌生單詞本+", size=(180, 30)) self.add_to_stranger_button.Bind(wx.EVT_BUTTON, self.on_add_to_stranger) self.set_font(self.add_to_stranger_button, 16) sizer.Add(self.add_to_stranger_button, 0, wx.ALL | wx.CENTER, 5) self.remove_from_stranger_button = wx.Button(panel, label="陌生單詞本-", size=(180, 30)) self.remove_from_stranger_button.Bind(wx.EVT_BUTTON, self.on_remove_from_stranger) self.set_font(self.remove_from_stranger_button, 16) sizer.Add(self.remove_from_stranger_button, 0, wx.ALL | wx.CENTER, 5) self.query_text = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER, size=(150, 25)) self.set_font(self.query_text, 16) sizer.Add(self.query_text, 0, wx.ALL | wx.CENTER, 5) self.query_button = wx.Button(panel, label="查詢單詞", size=(100, 30)) self.query_button.Bind(wx.EVT_BUTTON, self.on_query_word) self.set_font(self.query_button, 16) sizer.Add(self.query_button, 0, wx.ALL | wx.CENTER, 5) self.word_to_modify_text = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER, size=(150, 25)) self.set_font(self.word_to_modify_text, 16) sizer.Add(self.word_to_modify_text, 0, wx.ALL | wx.CENTER, 5) self.translation_to_modify_text = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER, size=(150, 25)) self.set_font(self.translation_to_modify_text, 16) sizer.Add(self.translation_to_modify_text, 0, wx.ALL | wx.CENTER, 5) self.modify_button = wx.Button(panel, label="修改單詞", size=(100, 30)) self.modify_button.Bind(wx.EVT_BUTTON, self.on_modify_word) self.set_font(self.modify_button, 16) sizer.Add(self.modify_button, 0, wx.ALL | wx.CENTER, 5) panel.SetSizer(sizer) self.show_translation = False # 記錄當(dāng)前狀態(tài) self.Center() def on_file_select(self, event): # 創(chuàng)建文件對(duì)話框,用于選擇單詞本文件 dlg = wx.FileDialog(self, "選擇單詞本文件", wildcard="文本文件 (*.txt)|*.txt", style=wx.FD_OPEN) # 顯示文件對(duì)話框并等待用戶操作 if dlg.ShowModal() == wx.ID_OK: # 用戶選擇了文件,獲取選中文件的路徑 file_path = dlg.GetPath() # 將選中文件的路徑設(shè)置給VocabularyAssistant實(shí)例 self.assistant.set_file_path(file_path) # 在界面上更新顯示當(dāng)前單詞本文件的標(biāo)簽 self.current_file_label.SetLabel(f"當(dāng)前單詞本:{file_path}") # 提示用戶已開(kāi)始新一輪學(xué)習(xí) wx.MessageBox("已開(kāi)始新一輪!", "提示", wx.OK | wx.ICON_INFORMATION) # 關(guān)閉文件對(duì)話框 dlg.Destroy() def on_toggle_button(self, event): # 檢查當(dāng)前狀態(tài)是否顯示翻譯 if self.show_translation: # 如果當(dāng)前顯示翻譯,則切換為顯示單詞 self.show_translation = False # 更新按鈕標(biāo)簽為“顯示翻譯” self.show_toggle_button.SetLabel("顯示翻譯") # 調(diào)用獲取單詞方法顯示單詞 self.on_get_word(event) else: # 如果當(dāng)前顯示單詞,則切換為顯示翻譯 self.show_translation = True # 更新按鈕標(biāo)簽為“顯示單詞” self.show_toggle_button.SetLabel("顯示單詞") # 調(diào)用顯示翻譯方法顯示翻譯 self.on_show_translation(event) def on_show_translation(self, event): # 獲取當(dāng)前單詞的翻譯 translation = self.assistant.get_translation() # 在文本框中顯示翻譯 self.translation_text.SetValue(translation) # 顯示文本框 self.translation_text.Show() # 更新布局 self.Layout() def on_get_word(self, event): # 獲取隨機(jī)單詞以及使用的單詞數(shù)量和總單詞數(shù)量 random_word, used_words, total_words = self.assistant.get_random_word() # 在標(biāo)簽中顯示隨機(jī)單詞 self.word_label.SetLabel(random_word) # 在進(jìn)度標(biāo)簽中顯示已使用的單詞數(shù)量和總單詞數(shù)量 self.progress_label.SetLabel(f" {used_words}/{total_words}") # 隱藏翻譯文本框 self.translation_text.Hide() # 更新布局 self.Layout() def on_query_word(self, event): word_to_query = self.query_text.GetValue() result = self.assistant.query_word(word_to_query) self.translation_text.SetValue(result) self.translation_text.Show() self.Layout() def on_modify_word(self, event): # 獲取要修改的單詞和新的翻譯 word_to_modify = self.word_to_modify_text.GetValue() translation_to_modify = self.translation_to_modify_text.GetValue() # 檢查輸入是否為空 if not word_to_modify or not translation_to_modify: # 如果輸入為空,顯示提示框并返回 wx.MessageBox("請(qǐng)輸入要修改的單詞和新翻譯!", "提示", wx.OK | wx.ICON_INFORMATION) return # 調(diào)用VocabularyAssistant實(shí)例的修改單詞方法,并獲取修改結(jié)果 success = self.assistant.modify_word(word_to_modify, translation_to_modify) # 根據(jù)修改結(jié)果顯示相應(yīng)的提示框 if success: wx.MessageBox("單詞修改成功!", "提示", wx.OK | wx.ICON_INFORMATION) else: wx.MessageBox("找不到要修改的單詞!", "提示", wx.OK | wx.ICON_INFORMATION) def on_add_to_stranger(self, event): # 獲取當(dāng)前單詞 word = self.word_label.GetLabel().strip() # 檢查當(dāng)前單詞是否為空 if not word: # 如果單詞為空,顯示錯(cuò)誤提示框并返回 wx.MessageBox("當(dāng)前單詞為空!", "錯(cuò)誤", wx.OK | wx.ICON_ERROR) return # 獲取當(dāng)前單詞本中的所有單詞及其翻譯 words = self.assistant.get_words() translation = None # 遍歷當(dāng)前單詞本中的每個(gè)單詞 for item in words: if len(item) == 2: # 檢查元素是否具有兩個(gè)值 w, t = item # 如果找到與當(dāng)前單詞相同的單詞,則獲取其翻譯 if w == word: translation = t break # 檢查是否找到了當(dāng)前單詞的翻譯 if translation: # 如果找到了當(dāng)前單詞的翻譯,則將該單詞和翻譯添加到陌生單詞本 self.assistant.add_to_stranger_list(word, translation) wx.MessageBox("已將單詞和翻譯添加到陌生單詞本!", "提示", wx.OK | wx.ICON_INFORMATION) else: # 如果在當(dāng)前單詞本中找不到當(dāng)前單詞的翻譯,則顯示錯(cuò)誤提示框 wx.MessageBox("在當(dāng)前單詞本中找不到該單詞的翻譯!", "錯(cuò)誤", wx.OK | wx.ICON_ERROR) def on_remove_from_stranger(self, event): # 獲取當(dāng)前單詞 word = self.word_label.GetLabel().strip() # 檢查當(dāng)前單詞是否為空 if not word: # 如果單詞為空,顯示錯(cuò)誤提示框并返回 wx.MessageBox("當(dāng)前單詞為空!", "錯(cuò)誤", wx.OK | wx.ICON_ERROR) return # 調(diào)用助手對(duì)象的方法從陌生單詞本中移除當(dāng)前單詞,并獲取更新后的陌生單詞本列表 updated_stranger_list = self.assistant.remove_from_stranger_list(word) # 顯示提示框,表示已成功從陌生單詞本中刪除該單詞 wx.MessageBox("已從陌生單詞本刪除該單詞!", "提示", wx.OK | wx.ICON_INFORMATION) def on_about(self, event): # 創(chuàng)建關(guān)于程序的消息對(duì)話框并顯示 dlg = wx.MessageDialog(self, "這是一個(gè)用來(lái)檢測(cè)單詞背誦效果的程序!", "關(guān)于程序", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def on_shuoming(self, event): # 創(chuàng)建使用說(shuō)明的消息對(duì)話框并顯示 dlg = wx.MessageDialog(self, "這是一個(gè)使用說(shuō)明,但是我懶得寫(xiě)說(shuō)明! (陌生單詞本會(huì)自動(dòng)創(chuàng)建在D:\陌生單詞本.txt)", "使用說(shuō)明", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def on_version(self, event): # 版本信息 version_info = """ 版本說(shuō)明 - 4.1.2版 更新內(nèi)容: 1. 4.1新增了陌生單詞本功能,現(xiàn)在用戶可以將不熟悉的單詞添加到陌生單詞本,方便后續(xù)復(fù)習(xí)和學(xué)習(xí)。(陌生單詞本路徑為:"D:\陌生單詞本.txt") 2. 4.1將選擇單詞本功能放到了菜單中,用戶現(xiàn)在可以通過(guò)菜單來(lái)選擇單詞本文件。 3. 4.1.1修復(fù)了一些已知的bug 4. 4.1.2修復(fù)了陌生單詞本的一些bug 此版本功能已經(jīng)比較完善 """ # 創(chuàng)建版本信息的消息對(duì)話框并顯示 dlg = wx.MessageDialog(self, version_info, "版本信息", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def on_thanks(self, event): # 致謝信息 dlg = wx.MessageDialog(self, "特別感謝菲菲與我一路同行!", "致謝", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def on_phone_and_qq(self, event): # 聯(lián)系方式 dlg = wx.MessageDialog(self, "QQ:2445423454", "聯(lián)系方式", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def set_font(self, control, size): # 設(shè)置控件字體 font = wx.Font(size, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) control.SetFont(font) if __name__ == "__main__": app = VocabularyApp(False) app.MainLoop()
到此這篇關(guān)于基于Python編寫(xiě)一個(gè)單詞自測(cè)程序的文章就介紹到這了,更多相關(guān)Python單詞自測(cè)程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)之畫(huà)圖神器matplotlib
這篇文章主要介紹了python基礎(chǔ)之畫(huà)圖神器matplotlib,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有一定的幫助,需要的朋友可以參考下2021-04-04Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別
這篇文章主要介紹了Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-04-04Python+Opencv實(shí)現(xiàn)圖像模板匹配詳解
模板匹配可以看作是對(duì)象檢測(cè)的一種非常基本的形式。使用模板匹配,我們可以使用包含要檢測(cè)對(duì)象的“模板”來(lái)檢測(cè)輸入圖像中的對(duì)象。本文為大家介紹了圖像模板匹配的實(shí)現(xiàn)方法,需要的可以參考一下2022-09-09