python - python - 如何将json文件中的值附加到python中的tkinter组合框?
问题描述
我正在尝试制作配置文件并将 json 数据保存到我已成功完成的 txt 文件中,现在我希望能够搜索我的 json 文件并将每个配置文件名称添加到组合框中。这是生成的 json 数据的示例。
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}
我试图做的是用for循环访问数据
with open('profiles.txt', 'r') as file:
profiles = json.load(file)
for profile in profiles['profile']:
profiles_select['values'] = profile['profile_name']
此解决方案有效,但仅适用于一个配置文件,一旦我添加第二个配置文件,我就会收到此错误
Extra data: line 19 column 1 (char 430)
具有多个配置文件的 json 文件看起来像这样
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}
所以我认为这是因为它不知道何时停止或开始检查每个值,所以我尝试按文件中的行进行。我试过这段代码
with open('profiles.txt', 'r') as file:
lines = file.readlines()
for lines in file:
profile_data = json.load(file)
for profile in profile_data['profile']:
profiles_select['values'] = profile['profile_name']
这不会产生错误,但不会在配置文件组合框中返回任何文本。如果有人在这里有任何见解,那将非常有帮助。
这是我编写 json 数据的方式
def save_profile():
try:
with open('profiles.txt', 'r', encoding='utf-8') as infile:
load_data_profile = json.load(infile)
except:
load_data_profile = {'profile': []} # default when file can't be read
load_data_profile['profile'].append({
'profile_name': profile_name_entry.get(),
'first_name': first_name_entry.get(),
'last_name': last_name_entry.get(),
'address': house_address_entry.get(),
'address2': house_address2_entry.get(),
'city': city_entry.get(),
'country': country_entry.get(),
'state': state_entry.get(),
'zip': zip_entry.get(),
'card_type': card_type_entry.get(),
'card_number': card_number_entry.get(),
'exp_month': card_exp_month_date_entry.get(),
'exp_year': card_exp_year_date_entry.get(),
'card_cvv': card_cvv_entry.get(),
'phone': phone_entry.get(),
'email': email_entry.get()
})
with open('profiles.txt', 'w', encoding='utf-8') as outfile:
json.dump(load_data_profile, outfile, indent=4)
解决方案
您的 JSON 是错误的,因此假设它实际上对于多个配置文件看起来像这样:
[{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
},
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}]
现在在这种情况下,您应该能够像这样解析它:
with open('profiles.txt', 'r') as file:
profiles = json.load(file)
for item in profiles:
profile = item["profile"]
profiles_select['values'] = profile['profile_name']
但请注意,您实际上根本不需要profile
这里的密钥。您可以只拥有一个 JSON 对象数组:
[{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
},
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}]
然后有:
with open('profiles.txt', 'r') as file:
profiles = json.load(file)
for profile in profiles:
profiles_select['values'] = profile['profile_name']
推荐阅读
- angular - Angular:可编辑表作为现有组件
- php - 无法使用来自 URL 的新值更新 MYSQL 数据库(使用 GET)
- reactjs - 使用样式组件在反应中设置 svg 样式?
- c++11 - c++ - 是否可以创建一个可选的承诺?
- javascript - JS:添加依赖于类的样式存在于兄弟姐妹中
- matrix - 错误,(在矩阵中)此条目太高或太短:1 尝试在 Maple 中定义矩阵时
- vuejs2 - 嵌套对象反应性vue js
- bundler - 从文件柜跟踪 Netsuite 脚本逻辑
- c# - 如何跟踪对 Web 视图内容 UWP 执行的操作
- html - 如何在有角度的材料的位置上粘贴标题?