Как добавить значения из файла JSON в поле со списком tkinter в Python?

Я пытаюсь создать профили и сохранить данные json в текстовый файл, что я успешно выполнил, теперь я хочу иметь возможность искать в моем файле json и добавлять каждое имя профиля в выпадающий список. Вот пример сгенерированных данных JSON.

{
"profile": [
    {
      "profile_name": 'name',
      "address": 'address',
      "city": 'yorktown',
    }
  ]
}

То, что я пытался сделать с этим, это получить доступ к данным с помощью цикла, сказав

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)

Всего 1 ответ


Ваш 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']

Есть идеи?

10000