20244125 2024-2025-2《Python程序设计》实验四报告
20244125 2024-2025-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2441
姓名: 魏怡彤
学号:20244125
实验教师:王志强
实验日期:2025年5月31日
必修/选修: 专选课
一.实验要求
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
二. 实验内容
结合一学期的Python课程学习以及自身情况,针对即将到来的英语四级考试,我决定制作一个能够运用 Python 语言结合 Tkinter 库开发一个英语单词记忆助手应用程序。通过该程序,可以实现单词的管理(添加、编辑、删除、导入)以及学习测试功能,帮助同学们在备考过程中更高效地记忆英语单词。同时通过此次实践,加深我对Python编程、Tkinter库以及数据处理等知识的理解与应用。
三. 实验过程
要制作出一个单词学习助手,首先就是需要创建一个可视化的学习页面。于是,我了解到了Tkinter这个方式,通过认真学习,终于成功在Python中用Tkinter创建出了简单的学习页面,代码如下:
成功实现第一步后,便正式开启了本次实验。在进行本次实验之前,通过在互联网上的学习以及老师上课所传授的知识,我决定采用模块化设计思想,主要将系统划分为以下2个核心模块:
1.数据管理模块:由VocabularyManager类实现,负责单词数据的存储、读取、更新以及从外部文件导入单词等操作。
2.界面交互模块:基于Tkinter库创建主窗口、标签页、各种组件(如按钮、文本框、列表框等),实现用户与系统的图形界面交互,包括单词管理界面和学习模式界面的设计与实现。
1.1数据管理模块
首先定义VocabularyManager类,通过以下方法:
(1)load_words方法:尝试从指定的 JSON 文件中读取单词数据,如果文件不存在,则返回一个空字典。代码如下:
(2)save_words方法:将当前内存中的单词数据保存到 JSON 文件中。代码如下:
(3)add_word方法:判断单词是否已存在于单词库中,若不存在,则将单词及其释义添加到单词库,并保存到文件。代码如下:
(4)import_from_file方法:从指定的文本文件中读取单词数据,按行解析,以制表符为分隔符分离单词和释义,调用add_word方法将单词添加到单词库,统计成功添加的单词数量并返回。代码如下:
(5)get_random_word方法:判断单词库是否为空,若不为空,则随机选择一个单词返回。代码如下:
2.1 界面交互模块实现
(1)创建主窗口和标签页:使用 Tkinter 创建主窗口,设置窗口标题为 “英语单词记忆助手”,并通过ttk.Notebook创建 “单词管理” 和 “学习模式” 两个标签页。以下为具体代码:
(2)单词管理界面组件创建:在 “单词管理” 标签页中,使用ttk.Treeview创建单词列表,设置列标题为 “单词” 和 “释义”,并将已有单词数据插入列表中。创建按钮框架,添加 “添加单词” 和 “导入单词” 按钮,并分别绑定对应的功能函数。以下为具体代码:
(3)学习模式界面组件创建:在 “学习模式” 标签页中,使用标签显示题目,创建单选按钮框架用于显示选择题选项。添加 “下一题” 和 “提交答案” 按钮,并分别绑定next_question和submit函数。以下为具体代码:
最终,经过不断调节与测试,英语单词记忆助手的各项功能均能正常运行,达到了预期的设计目标。单词管理功能实现了对单词库的有效管理,学习测试功能为我们提供了便捷的单词学习和测试途径。但是,在测试过程中也发现一些可以改进的地方,例如界面设计的美观度有待提升,目前仅满足基本功能需求,缺乏视觉吸引力;学习算法相对简单,未能充分考虑使用者的记忆规律,例如可以进一步结合艾宾浩斯记忆曲线算法来优化单词的复习顺序,提高记忆效率。(现阶段Python水平暂时无法实现,以后有机会希望可以进一步学习。)
四.实验问题与解决
- 问题1:刚开始的页面需要自己手动导入单词,在寻找更高效的办法时发现需要下载别的软件操作难度较大。
- 问题1解决方案:在询问互联网后,我采取了在PyCharm中创建一个words.txt文件,通过粘贴需要记忆的单词们在文件中,然后将文件导入学习界面,完美解决了手动导入单词以及其他方法操作难度大的问题。
- 问题2:在某些情况下,点击按钮后没有任何反应,程序似乎没有执行对应的函数。
- 问题2解决方案:经过排查,确定问题原因是按钮事件绑定的函数可能在定义之前就被引用,或者函数内部存在错误导致执行中断。针对这个问题,我首先确保所有函数在被引用之前已经正确定义,并且在next_question和submit等函数中添加了适当的错误处理代码,例如增加打印语句来辅助调试,以便在出现问题时能快速定位错误。经过这些调整,按钮功能恢复正常。
五.实验结果
点击查看代码
import tkinter as tk
from tkinter import ttk
def main():
root = tk.Tk()
root.title("英语单词记忆助手")
root.mainloop()
if __name__ == '__main__':
main()
import tkinter as tk
from tkinter import ttk, filedialog
import json
import random
class VocabularyManager:
def __init__(self, file_path='words.json'):
self.file_path = file_path
self.words = self.load_words()
def load_words(self):
try:
with open(self.file_path, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
return {}
def save_words(self):
with open(self.file_path, 'w', encoding='utf-8') as f:
json.dump(self.words, f, ensure_ascii=False, indent=2)
def add_word(self, word, meaning):
if word not in self.words:
self.words[word] = meaning
self.save_words()
return True
return False
def import_from_file(self, file_path, separator='\t'):
added = 0
try:
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if not line:
continue
parts = line.split(separator)
if len(parts) >= 2:
word, meaning = parts[0], parts[1]
if self.add_word(word, meaning):
added += 1
return added
except Exception as e:
print(f"导入失败: {e}")
return 0
def main():
root = tk.Tk()
root.title("英语单词记忆助手")
vocab_manager = VocabularyManager()
notebook = ttk.Notebook(root)
notebook.pack(fill='both', expand=True)
word_manage_tab = ttk.Frame(notebook)
notebook.add(word_manage_tab, text="单词管理")
study_mode_tab = ttk.Frame(notebook)
notebook.add(study_mode_tab, text="学习模式")
# 单词管理标签页
word_tree = ttk.Treeview(word_manage_tab, columns=('word', 'meaning'), show='headings')
word_tree.heading('word', text='单词')
word_tree.heading('meaning', text='释义')
word_tree.pack(fill='both', expand=True, padx=10, pady=10)
for word, meaning in vocab_manager.words.items():
word_tree.insert('', 'end', values=(word, meaning))
btn_frame = ttk.Frame(word_manage_tab)
btn_frame.pack(fill='x', padx=10, pady=5)
def add_word():
dialog = tk.Toplevel(root)
dialog.title("添加单词")
ttk.Label(dialog, text="单词:").grid(row=0, column=0, padx=5, pady=5)
word_entry = ttk.Entry(dialog)
word_entry.grid(row=0, column=1, padx=5, pady=5)
ttk.Label(dialog, text="释义:").grid(row=1, column=0, padx=5, pady=5)
meaning_entry = ttk.Entry(dialog)
meaning_entry.grid(row=1, column=1, padx=5, pady=5)
def save():
word = word_entry.get().strip()
meaning = meaning_entry.get().strip()
if word and meaning and vocab_manager.add_word(word, meaning):
word_tree.insert('', 'end', values=(word, meaning))
dialog.destroy()
else:
tk.messagebox.showwarning("警告", "单词已存在或输入为空")
ttk.Button(dialog, text="保存", command=save).grid(row=2, column=0, columnspan=2, pady=5)
def import_words():
file_path = filedialog.askopenfilename(
title="选择单词文件",
filetypes=[("文本文件", "*.txt"), ("CSV文件", "*.csv")]
)
if file_path:
count = vocab_manager.import_from_file(file_path)
for item in word_tree.get_children():
word_tree.delete(item)
for word, meaning in vocab_manager.words.items():
word_tree.insert('', 'end', values=(word, meaning))
tk.messagebox.showinfo("成功", f"已导入 {count} 个单词")
ttk.Button(btn_frame, text="添加单词", command=add_word).pack(side='left', padx=5)
ttk.Button(btn_frame, text="导入单词", command=import_words).pack(side='left', padx=5)
# 学习模式标签页
question_label = ttk.Label(study_mode_tab, text="点击开始测试")
question_label.pack(pady=10)
option_var = tk.StringVar()
option_frame = ttk.Frame(study_mode_tab)
option_frame.pack(pady=10)
def next_question():
word = vocab_manager.get_random_word()
if not word:
tk.messagebox.showinfo("提示", "单词库为空,请先添加单词")
return
correct = vocab_manager.words[word]
distractors = [m for m in vocab_manager.words.values() if m != correct]
options = [correct] + random.sample(distractors, min(3, len(distractors)))
random.shuffle(options)
for widget in option_frame.winfo_children():
widget.destroy()
option_var.set('')
question_label.config(text=f"'{word}' 的意思是:")
for opt in options:
ttk.Radiobutton(option_frame, text=opt, variable=option_var, value=opt).pack(anchor='w', padx=10)
def submit():
selected = option_var.get()
if not selected:
tk.messagebox.showwarning("警告", "请选择答案")
return
word = question_label.cget('text').split("'")[1]
correct = vocab_manager.words[word]
msg = "正确" if selected == correct else f"错误,正确答案:{correct}"
tk.messagebox.showinfo("结果", msg)
ttk.Button(study_mode_tab, text="下一题", command=next_question).pack(pady=5)
ttk.Button(study_mode_tab, text="提交答案", command=submit).pack(pady=5)
root.mainloop()
运行视频麻烦老师点击一下连接查看:
【Python综合实验 20244125】 https://www.bilibili.com/video/BV1CV7SzBEcH/?share_source=copy_web&vd_source=73256950e8b8108d6c903812d1918b59
其他(感悟、思考等)
(1)实验与课程总结:
通过本学期Python课程的学习和实践,我对 Python 编程有了更深入的理解和掌握。从最初对 Python 基础语法的学习,到逐步接触和运用各种库来实现具体功能,这个过程充满了挑战与收获。在开发英语单词记忆助手的过程中,我深刻体会到了编程需要严谨的逻辑思维和耐心。例如,在编写代码,一个小小的语法错误或逻辑漏洞都可能导致程序出现异常,这就要求我们必须仔细检查代码,不断调试优化。同时,通过四个实验的训练与实践,我学会了如何将所学的理论知识应用到实际开发中,提高了解决实际问题的能力。总之,十分感谢王老师的教导与帮助,让初入大学作为文科生的我,打开了一扇全新的知识大门。作为文科专业的学生,我们习惯了形象思维和文字表达,而编程需要的是严谨的逻辑思维和抽象思维。在学习 Python 的过程中,我努力培养自己的编程思维。在王老师的引领下,从分析问题开始,将每一个问题拆解成一个个小的步骤,到用代码实现这些步骤,每一个环节都需要理性的思考和精确的表达。
这门 Python 设计课程不仅让我学到了实用的编程技能,更让我明白,即使是看似遥不可及的技术领域,只要有决心和毅力,不断学习和实践,也能够有所突破。感谢王老师,让我感受到了计算机的魅力,每一次实验的开展,每一次课上的讲授,都让我对于Python强大能力的认识进一步加深。在以后的学习生活里,即使不会再像现在一样进行系统的课程学习,我也希望有机会可以抱着好奇的态度尝试更多设计,继续带着兴趣在编程的道路上探索前进!
(2)意见和建议:
a.希望老师在上课过程中添加更多的具体知识讲解,编写代码的时候可以稍微放慢一点速度,可以更好地帮助同学们理解知识;
b.可以提前在学习通或wx群里发布下一节课的具体内容,帮助同学们更有针对性地预习,更深刻地理解课程内容。