You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:00:18