基于Python編寫一個(gè)單詞自測程序
更新時(shí)間:2024年12月13日 10:41:41 作者:抱抱你養(yǎng)的貓231
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫一個(gè)單詞自測程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
直接上最終版本!

此程序需要配合單詞本使用,單詞本格式為txt(單詞 翻譯),附考研英語單詞本(完整版關(guān)注我,私信領(lǐng)?。?/p>
程序打包為exe的教程:
import wx
import random
class VocabularyAssistant:
def __init__(self, file_path):
# 初始化 VocabularyAssistant 類的實(shí)例。
# 單詞本文件的路徑。
self.file_path = file_path
# 包含單詞和對應(yīng)翻譯的列表。
self.words = []
# 當(dāng)前隨機(jī)選擇的單詞和翻譯,格式為 (word, translation)。
self.current_word = None
# 存儲(chǔ)已經(jīng)出現(xiàn)過的單詞。
self.used_words = set()
# 存儲(chǔ)已經(jīng)訪問過的單詞的索引。
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):
# 如果所有單詞都被訪問過,重新加載單詞列表
if len(self.visited_words) == len(self.words):
self.visited_words.clear() # 清空已訪問單詞記錄
self.refresh_words() # 重新加載單詞列表
wx.MessageBox("已開始新一輪!", "提示", wx.OK | wx.ICON_INFORMATION)
# 隨機(jī)選擇未訪問過的單詞
remaining_words = set(range(len(self.words))) - self.visited_words
if not remaining_words:
wx.MessageBox("已開始新一輪!", "提示", wx.OK | wx.ICON_INFORMATION)
self.visited_words.clear() # 清空已訪問單詞記錄
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 "請先獲取一個(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)容重新寫入文件
with open(stranger_list_path, 'w', encoding='utf-8') as file:
for line in lines:
if not line.startswith(f"{word} "): # 不是當(dāng)前單詞的行寫回文件
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='單詞自測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, "&幫助")
# 添加“使用說明”菜單項(xiàng)
shuoming_item = help_menu.Append(wx.ID_ANY, "&使用說明", "關(guān)于程序的使用說明")
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)建文件對話框,用于選擇單詞本文件
dlg = wx.FileDialog(self, "選擇單詞本文件", wildcard="文本文件 (*.txt)|*.txt", style=wx.FD_OPEN)
# 顯示文件對話框并等待用戶操作
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}")
# 提示用戶已開始新一輪學(xué)習(xí)
wx.MessageBox("已開始新一輪!", "提示", wx.OK | wx.ICON_INFORMATION)
# 關(guān)閉文件對話框
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("請輸入要修改的單詞和新翻譯!", "提示", 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)用助手對象的方法從陌生單詞本中移除當(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)于程序的消息對話框并顯示
dlg = wx.MessageDialog(self, "這是一個(gè)用來檢測單詞背誦效果的程序!", "關(guān)于程序", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
def on_shuoming(self, event):
# 創(chuàng)建使用說明的消息對話框并顯示
dlg = wx.MessageDialog(self,
"這是一個(gè)使用說明,但是我懶得寫說明! (陌生單詞本會(huì)自動(dòng)創(chuàng)建在D:\陌生單詞本.txt)",
"使用說明", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
def on_version(self, event):
# 版本信息
version_info = """
版本說明 - 4.1.2版
更新內(nèi)容:
1. 4.1新增了陌生單詞本功能,現(xiàn)在用戶可以將不熟悉的單詞添加到陌生單詞本,方便后續(xù)復(fù)習(xí)和學(xué)習(xí)。(陌生單詞本路徑為:"D:\陌生單詞本.txt")
2. 4.1將選擇單詞本功能放到了菜單中,用戶現(xiàn)在可以通過菜單來選擇單詞本文件。
3. 4.1.1修復(fù)了一些已知的bug
4. 4.1.2修復(fù)了陌生單詞本的一些bug
此版本功能已經(jīng)比較完善
"""
# 創(chuàng)建版本信息的消息對話框并顯示
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編寫一個(gè)單詞自測程序的文章就介紹到這了,更多相關(guān)Python單詞自測程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別
這篇文章主要介紹了Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-04-04
Python+Opencv實(shí)現(xiàn)圖像模板匹配詳解
模板匹配可以看作是對象檢測的一種非常基本的形式。使用模板匹配,我們可以使用包含要檢測對象的“模板”來檢測輸入圖像中的對象。本文為大家介紹了圖像模板匹配的實(shí)現(xiàn)方法,需要的可以參考一下2022-09-09

