如何在没有 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}")
但是,这不会处理输入根本不存在的名称的情况。
我正在尝试使用 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}")
但是,这不会处理输入根本不存在的名称的情况。