【问题标题】:How to update key-value in dictionary everytime the user clicks the button?每次用户单击按钮时如何更新字典中的键值?
【发布时间】:2019-05-23 02:53:47
【问题描述】:

单击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']}

【问题讨论】:

  • Dict 效率不高。我认为 DataFrame 更适合这种数据。
  • 谢谢,我会进一步研究。
  • 如果你需要,我可以给你一个样品。祝你有美好的一天~!

标签: python python-3.x dictionary tkinter


【解决方案1】:

这个问题并不是一个 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']}

您可以使用collections.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 的行为方式符合您的要求。

【讨论】:

  • 它仍然给了我相同的结果,但非常感谢你回答我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多