如何在没有 python 错误的情况下读取多个 JSON 条目

How to read multiple JSON entry's without python error

我正在尝试使用 tkinter gui 制作一个简单的 python 程序,该程序可以接受用户输入并将其添加到 JSON 文件中。然后会有另一个输入,用户可以在其中输入名称并查找使用该名称输入的数据。到目前为止,我可以将信息写入 JSON 文件。键自动是名称后跟数据类型。这样,当用户输入名称时,我的程序可以将数据类型添加到名称的末尾,并获得所需数据的键。此系统仅在 JSON 文件中只有一个对象时才有效。当我添加 2 时出现以下错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\liamm\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "c:\Users\liam\Desktop\Coding\json test\datagui.py", line 17, in find
    Age = entry[Agevar]
KeyError: 'Steve_Age'

我不确定为什么我会收到 tkinter 错误和一个键错误,而它说有错误的键是 JSON 文件中的一个有效键。

这里是 JSON 文件,其中包含一些测试数据,但将创建更多数据。

[
    {
        "Bob_NAME": "Bob",
        "Bob_Age": "40",
        "Bob_Weight": "200"
    },
    {
        "Steve_NAME": "Steve",
        "Steve_Age": "30",
        "Steve_Weight": "150"
    }
]

这是我的python程序

from tkinter import *
from tkinter import ttk
import json
from tokenize import Name
from setuptools import Command

 

filename = "test.json"

def find():
        with open (filename, "r") as f:
            finder = json.load(f)
#Adding the name and _Age to find the key for the right information
        Agevar = E4.get()+"_Age"
        for entry in finder:
                Age = entry[Agevar]
                print(f"Age: {Age}")






def add_data():





    Namevar = E1.get()+"_NAME" 
    Agevar = E1.get()+"_Age"
    Weightvar = E1.get()+"_Weight"

    item_data = {}
    with open (filename, "r") as f:
            temp = json.load(f)
    item_data[Namevar] = E1.get()
    item_data[Agevar] = E2.get()
    item_data[Weightvar] = E3.get()
    temp.append(item_data)
    with open (filename, "w") as f:
            json.dump(temp, f, indent=4)
            print(Namevar)
            print(Agevar)
            print(Weightvar)
            






top = Tk()

top.geometry("500x300")

L1 = Label(top, text="Enter information")
L1.grid(row=1, column=1)

L1 = Label(top, text="Name:")
L1.grid(row=2, column=1)

L1 = Label(top, text="Age:")
L1.grid(row=3, column=1)

L1 = Label(top, text="Weight:")
L1.grid(row=4, column=1)

L1 = Label(top, text="Find: ")
L1.grid(row=3, column=3)



E1 = Entry(top, bd =5)
E1.grid(row=2, column= 2)

E2 = Entry(top, bd =5)
E2.grid(row=3, column= 2)

E3 = Entry(top, bd =5)
E3.grid(row=4, column= 2)


E4 = Entry(top, bd= 5)
E4.grid(row= 3, column= 4)

btn = Button(top, command = add_data, text = "Add", height = 2, width = 5)
btn.grid(row=5, column=2)

btn2 = Button(top, command = find, text = "Find", height = 2, width = 5)
btn2.grid(row=5, column=4)

top.mainloop()

问题源于以下行:

for entry in finder:

这是因为 finder 是一个字典列表。该列表中的第一项引用 Bob。您使用的代码 运行 似乎正在寻找 Steve,这是该列表中的第二项。您需要放置一些关于 Agevar = E4.get()+"_Age" 的逻辑,因为这可以 return 任何人的名字。

您可以将代码更改为以下内容:

for entry in finder:
    Age = entry.get(Agevar)
    if Age:
        print(f"Age: {Age}")

但是,这不会处理输入根本不存在的名称的情况。