Как обновлять значение ключа в словаре каждый раз, когда пользователь нажимает кнопку? - PullRequest
0 голосов
/ 22 мая 2019

Я не могу обновить значение ключа в словаре после нажатия кнопки save, но я не знаю, что не так с моим кодом?

Это для моего маленького проекта, я хочу попробовать написать код для создания приложения (для личного использования), используя Tkinter, чтобы установить и получить данные из записей и сохранить их в CSV-файл. Но я застрял на обновлении моего словаря. Я пытался сделать мой dict глобальной переменной, но он все еще продолжал удалять старое значение ключа из предыдущего клика. В какой-то момент во время проб и ошибок произошла ошибка о том, что моя переменная dict не определена.

def Save(self):

    self.new_first_name = self.first_name.get()
    self.new_last_name = self.last_name.get()
    self.new_id = self.id.get()
    self.new_age = self.age.get()

    self.dirname = "J:/Webcam"
    self.new_dict = {}

    def create_dict():
        global old_dict
        if 'old_dict' not in globals():
            global old_dict
            old_dict = {"ID": None, "First_Name" : None, "Last_Name": None, "Age": None}
        else:
            pass
        return old_dict
    create_dict()

    self.new_dict['ID'] = self.new_id
    self.new_dict['First_Name'] = self.new_first_name
    self.new_dict['Last_Name'] = self.new_last_name
    self.new_dict['Age'] = self.new_age

    old_dict.update(self.new_dict)

    # os.chdir(self.dirname)
    # w = csv.writer(open("output.csv", "w"))
    # for key, val in old_dict.items():
    #     w.writerow([key, val])
    return old_dict

Это результат после того, как я дважды нажал кнопку «Сохранить».

{'ID': 'AA', 'First_Name': 'AA', 'Last_Name': 'AA', 'Age': 'AA'}

{'ID': 'BB', 'First_Name': 'BB', 'Last_Name': 'BB', 'Age': 'BB'}

То, что я хочу, это так:

{'ID': ['AA','BB'], 'First_Name': ['AA','BB'], 'Last_Name': ['AA','BB'], 'Age': ['AA','BB']}

1 Ответ

1 голос
/ 22 мая 2019

Эта проблема не является проблемой TkInter.Вы можете воспроизвести подобное поведение с помощью командной строки Python.

Попробуйте:

>>> old_dict = {}
>>> old_dict['ID'] = 'AA'
>>> old_dict['ID'] = 'BB'
>>> old_dict
{'ID': 'BB'}

Это потому, что сначала вы устанавливаете значение ключа 'ID' равным 'AA', а затемна «BB».

То, что вы хотите сделать, это сделать так, чтобы словарь содержал список для каждого ключа и всегда добавлялся к этим спискам.

>>> old_dict = {}
>>> old_dict['ID'] = []
>>> old_dict['ID'].append('AA')
>>> old_dict['ID'].append('BB')
>>> old_dict
{'ID': ['AA', 'BB']}

Вы могли бы сэкономить немного усилийс помощью collection.defaultdict :

>>> import collections
>>> old_dict = collections.defaultdict(list)
>>> old_dict['ID'].append('AA')
>>> old_dict['ID'].append('BB')
>>> old_dict
{'ID': ['AA', 'BB']}

Все, что defaultdict делает, как указано в этом коде, создает для вас список для любого ключа, который еще не имеетзначение.

Если вы примените такую ​​логику к своему коду, вы должны обнаружить, что tkInter ведет себя так, как вы этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...