使用Python+JSON开发词典程序时遇TypeError报错求助
解决TypeError: 'module' object is not callable错误并修复词典程序
主要问题及修复步骤
1. path模块使用错误
你导入的path是Python模块,不能直接当作函数调用(path("json.json")),且.()这种写法完全无效。读取JSON文件无需额外模块,直接用内置open函数即可,同时json.load()可直接读取文件对象,不需要先用json.loads处理字符串。
修复:
删除import path,替换为正确的文件读取代码:
with open("json.json", "r", encoding="utf-8") as f: word_list = json.load(f)
2. 重复导入模块
代码中重复导入了tkinter、path、json,直接删除重复的导入块即可。
3. 初始化时过早调用查询方法
在__init__里直接调用self.dictionary(),此时用户还未输入内容,self.Entry_1.get()会得到空字符串,触发KeyError。应将查询方法绑定到搜索按钮的点击事件上,而非初始化时执行。
4. 搜索按钮未绑定事件
原按钮未设置command参数,点击后无反应,需添加command=self.dictionary绑定查询逻辑。
5. 拼写错误修正
serch改为search(标签、按钮文本)dictionery改为dictionary(窗口标题)
修正后的完整代码
from tkinter import * from tkinter import ttk import json # 读取JSON词典数据,增加异常处理 try: with open("json.json", "r", encoding="utf-8") as f: word_list = json.load(f) except FileNotFoundError: print("错误:未找到json.json文件") word_list = {} class DictionaryWindow(Tk): def __init__(self): super().__init__() self.title('Dictionary') self.minsize(380, 250) self.labels() def labels(self): # 搜索标签 self.Label_1 = ttk.Label(self, text='Search') self.Label_1.grid(column=3, row=0, padx=55) # 输入框 self.Entry_1 = Entry(self) self.Entry_1.grid(column=3, row=1, padx=50) # 结果列表框 self.listBox = Listbox(self, height=10, width=40) self.listBox.grid(column=3, row=3, padx=60) # 搜索按钮,绑定查询方法 self.button = ttk.Button(self, text='Search', command=self.dictionary) self.button.place(x=250, y=14) def dictionary(self): # 清空之前的查询结果 self.listBox.delete(0, END) word = self.Entry_1.get().strip() if not word: self.listBox.insert(END, "请输入要查询的单词") return # 查询并显示结果,避免KeyError meanings = word_list.get(word, ["未找到该单词的释义"]) for meaning in meanings: self.listBox.insert(END, meaning) if __name__ == "__main__": window = DictionaryWindow() window.mainloop()
额外优化说明
- 增加文件不存在的异常处理,避免程序直接崩溃
- 查询前清空列表框,防止多次查询结果叠加
- 对输入内容做去空格处理,避免无效输入
- 用
dict.get()替代直接索引,避免找不到单词时抛出错误
内容的提问来源于stack exchange,提问作者Nima
相关产品推荐
相关产品推荐

