直接上最终版本!
此程序需要配合单词本使用,单词本格式为txt(单词 翻译),附考研英语单词本(完整版关注我,私信领取)
程序打包为exe的教程:关注我+私信
import wx
import random
class VocabularyAssistant:
def __init__(self, file_path):
# 初始化 VocabularyAssistant 类的实例。
# 单词本文件的路径。
self.file_path = file_path
# 包含单词和对应翻译的列表。
self.words = []
# 当前随机选择的单词和翻译,格式为 (word, translation)。
self.current_word = None
# 存储已经出现过的单词。
self.used_words = set()
# 存储已经访问过的单词的索引。
self.visited_words = set()
def refresh_words(self):
# 刷新单词列表,重新加载单词本文件中的单词。
# 加载单词本文件中的单词。
self.words = self.load_words()
def load_words(self):
# 从文件中加载单词列表。
words = [] # 存储单词和翻译的列表
if self.file_path:
try:
with open(self.file_path, 'r', encoding='utf-8') as file:
# 逐行读取文件内容,并解析为单词和翻译的列表。
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):
# 设置单词本文件的路径,并刷新单词列表。
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)
# 随机选择未访问过的单词
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):
# 获取当前单词的翻译。
if self.current_word:
# 返回翻译部分
translation = self.current_word[1] if len(self.current_word) > 1 else "未提供翻译"
return translation
else:
return "请先获取一个单词"
def query_word(self, word):
# 查询指定单词的翻译。
for item in self.words:
if len(item) == 2: # 检查元素是否具有两个值
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: # 检查元素是否具有两个值
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: # 检查元素是否具有两个值
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):
# 从陌生单词本中移除指定单词。
# 构建陌生单词表文件路径
stranger_list_path = "D:\陌生单词本.txt"
# 读取陌生单词表文件内容
with open(stranger_list_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 将不是当前单词的内容重新写入文件
with open(stranger_list_path, 'w', encoding='utf-8') as file:
for line in lines:
if not line.startswith(f"{word} "): # 不是当前单词的行写回文件
file.write(line)
# 返回陌生单词表文件的内容
return lines
def get_words(self):
# 返回当前单词列表。
return self.words
class VocabularyApp(wx.App):
def OnInit(self):
# 初始化应用程序,创建主窗口并显示
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实例化时不需要初始文件路径
self.assistant = VocabularyAssistant('')
# 创建菜单栏
menu_bar = wx.MenuBar()
# 创建“文件”菜单
file_menu = wx.Menu()
menu_bar.Append(file_menu, "&文件")
# 添加选择单词本文件的菜单项
select_vocabulary_item = file_menu.Append(wx.ID_ANY, "&选择单词本文件", "选择单词本文件")
self.Bind(wx.EVT_MENU, self.on_file_select, select_vocabulary_item)
# 创建“帮助”菜单
help_menu = wx.Menu()
menu_bar.Append(help_menu, "&帮助")
# 添加“使用说明”菜单项
shuoming_item = help_menu.Append(wx.ID_ANY, "&使用说明", "关于程序的使用说明")
self.Bind(wx.EVT_MENU, self.on_shuoming, shuoming_item)
# 创建“关于”菜单
about_menu = wx.Menu()
menu_bar.Append(about_menu, "&关于")
# 创建关于作者子菜单
about_author_submenu = wx.Menu()
contact_item = about_author_submenu.Append(wx.ID_ANY, "&联系方式", "显示作者的联系方式")
self.Bind(wx.EVT_MENU, self.on_phone_and_qq, contact_item)
about_menu.AppendSubMenu(about_author_submenu, "&关于作者")
# 添加“关于程序”菜单项
about_item = about_menu.Append(wx.ID_ABOUT, "&关于程序", "关于该程序的信息")
self.Bind(wx.EVT_MENU, self.on_about, about_item)
# 添加“版本信息”菜单项
version_item = about_menu.Append(wx.ID_ANY, "&版本信息", "关于该程序版本的信息")
self.Bind(wx.EVT_MENU, self.on_version, version_item)
# 添加“致谢”菜单项
thanks_item = about_menu.Append(wx.ID_ANY, "&致谢", "关于该程序版本的信息")
self.Bind(wx.EVT_MENU, self.on_thanks, thanks_item)
# 设置菜单栏
self.SetMenuBar(menu_bar)
# 创建面板和控件
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
# 创建并添加控件
self.current_file_label = wx.StaticText(panel, label="当前单词本:")
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 # 记录当前状态
self.Center()
def on_file_select(self, event):
# 创建文件对话框,用于选择单词本文件
dlg = wx.FileDialog(self, "选择单词本文件", wildcard="文本文件 (*.txt)|*.txt", style=wx.FD_OPEN)
# 显示文件对话框并等待用户操作
if dlg.ShowModal() == wx.ID_OK:
# 用户选择了文件,获取选中文件的路径
file_path = dlg.GetPath()
# 将选中文件的路径设置给VocabularyAssistant实例
self.assistant.set_file_path(file_path)
# 在界面上更新显示当前单词本文件的标签
self.current_file_label.SetLabel(f"当前单词本:{file_path}")
# 提示用户已开始新一轮学习
wx.MessageBox("已开始新一轮!", "提示", wx.OK | wx.ICON_INFORMATION)
# 关闭文件对话框
dlg.Destroy()
def on_toggle_button(self, event):
# 检查当前状态是否显示翻译
if self.show_translation:
# 如果当前显示翻译,则切换为显示单词
self.show_translation = False
# 更新按钮标签为“显示翻译”
self.show_toggle_button.SetLabel("显示翻译")
# 调用获取单词方法显示单词
self.on_get_word(event)
else:
# 如果当前显示单词,则切换为显示翻译
self.show_translation = True
# 更新按钮标签为“显示单词”
self.show_toggle_button.SetLabel("显示单词")
# 调用显示翻译方法显示翻译
self.on_show_translation(event)
def on_show_translation(self, event):
# 获取当前单词的翻译
translation = self.assistant.get_translation()
# 在文本框中显示翻译
self.translation_text.SetValue(translation)
# 显示文本框
self.translation_text.Show()
# 更新布局
self.Layout()
def on_get_word(self, event):
# 获取随机单词以及使用的单词数量和总单词数量
random_word, used_words, total_words = self.assistant.get_random_word()
# 在标签中显示随机单词
self.word_label.SetLabel(random_word)
# 在进度标签中显示已使用的单词数量和总单词数量
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
# 调用VocabularyAssistant实例的修改单词方法,并获取修改结果
success = self.assistant.modify_word(word_to_modify, translation_to_modify)
# 根据修改结果显示相应的提示框
if success:
wx.MessageBox("单词修改成功!", "提示", wx.OK | wx.ICON_INFORMATION)
else:
wx.MessageBox("找不到要修改的单词!", "提示", wx.OK | wx.ICON_INFORMATION)
def on_add_to_stranger(self, event):
# 获取当前单词
word = self.word_label.GetLabel().strip()
# 检查当前单词是否为空
if not word:
# 如果单词为空,显示错误提示框并返回
wx.MessageBox("当前单词为空!", "错误", wx.OK | wx.ICON_ERROR)
return
# 获取当前单词本中的所有单词及其翻译
words = self.assistant.get_words()
translation = None
# 遍历当前单词本中的每个单词
for item in words:
if len(item) == 2: # 检查元素是否具有两个值
w, t = item
# 如果找到与当前单词相同的单词,则获取其翻译
if w == word:
translation = t
break
# 检查是否找到了当前单词的翻译
if translation:
# 如果找到了当前单词的翻译,则将该单词和翻译添加到陌生单词本
self.assistant.add_to_stranger_list(word, translation)
wx.MessageBox("已将单词和翻译添加到陌生单词本!", "提示", wx.OK | wx.ICON_INFORMATION)
else:
# 如果在当前单词本中找不到当前单词的翻译,则显示错误提示框
wx.MessageBox("在当前单词本中找不到该单词的翻译!", "错误", wx.OK | wx.ICON_ERROR)
def on_remove_from_stranger(self, event):
# 获取当前单词
word = self.word_label.GetLabel().strip()
# 检查当前单词是否为空
if not word:
# 如果单词为空,显示错误提示框并返回
wx.MessageBox("当前单词为空!", "错误", wx.OK | wx.ICON_ERROR)
return
# 调用助手对象的方法从陌生单词本中移除当前单词,并获取更新后的陌生单词本列表
updated_stranger_list = self.assistant.remove_from_stranger_list(word)
# 显示提示框,表示已成功从陌生单词本中删除该单词
wx.MessageBox("已从陌生单词本删除该单词!", "提示", wx.OK | wx.ICON_INFORMATION)
def on_about(self, event):
# 创建关于程序的消息对话框并显示
dlg = wx.MessageDialog(self, "这是一个用来检测单词背诵效果的程序!", "关于程序", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
def on_shuoming(self, event):
# 创建使用说明的消息对话框并显示
dlg = wx.MessageDialog(self,
"这是一个使用说明,但是我懒得写说明! (陌生单词本会自动创建在D:\陌生单词本.txt)",
"使用说明", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
def on_version(self, event):
# 版本信息
version_info = """
版本说明 - 4.1.2版
更新内容:
1. 4.1新增了陌生单词本功能,现在用户可以将不熟悉的单词添加到陌生单词本,方便后续复习和学习。(陌生单词本路径为:"D:\陌生单词本.txt")
2. 4.1将选择单词本功能放到了菜单中,用户现在可以通过菜单来选择单词本文件。
3. 4.1.1修复了一些已知的bug
4. 4.1.2修复了陌生单词本的一些bug
此版本功能已经比较完善
"""
# 创建版本信息的消息对话框并显示
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):
# 联系方式
dlg = wx.MessageDialog(self, "QQ:2445423454", "联系方式", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
def set_font(self, control, size):
# 设置控件字体
font = wx.Font(size, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
control.SetFont(font)
if __name__ == "__main__":
app = VocabularyApp(False)
app.MainLoop()
大家有何需求,可私信我!