基于Python编写一个单词自测程序
更新时间:2024年12月13日 10:41:41 作者:抱抱你养的猫231
这篇文章主要为大家详细介绍了如何基于Python编写一个单词自测程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
直接上最终版本!
此程序需要配合单词本使用,单词本格式为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()
到此这篇关于基于Python编写一个单词自测程序的文章就介绍到这了,更多相关Python单词自测程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python 中 关于reverse() 和 reversed()的用法详解
这篇文章主要介绍了python 中 关于reverse() 和 reversed()的用法介绍,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-01-01使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
这篇文章主要介绍了使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-05-05
最新评论