首页 > 解决方案 > 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)

标签: pythonjsontkinter

解决方案


您的 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']

推荐阅读