【问题标题】:Problems using .get to retrieve values from dictionary使用 .get 从字典中检索值的问题
【发布时间】:2020-02-28 02:30:35
【问题描述】:

我正在尝试编写一些循环来从字典中检索值并将它们打印为检查按钮。我遇到的问题是,当我使用键入的代码时,我得到 PY_VAR01 等作为我的“名称”

我知道我需要使用 .get() 来获取值,但是当我输入 text=versions[2]['Name'].get() 时,我的名字显示为空白。我一直在寻找和尝试不同的东西,但无法得到任何帮助,如果有人能指出我正确的方向,我将不胜感激。

versions = { 1: {'Name': '5.11 - CO', 'Location': '#',
                 'Name': 'WS 2016 V1607', 'Location': '#',
                 'Name': 'Win 10 PRO V1803', 'Location': '#',
                 'Name': 'TEST 1', 'Location': '#',
                 'Name': 'TEST 2', 'Location': '#',
                 'Name': 'Test 3', 'Location': '#',
                 'Name': 'TEST 4', 'Location': '#',
                 'Name': 'TEST 5', 'Location': '#',
                 },
             2: {'Name':


# Version_5_5_EAC
v5_5_eac_options = Frame(optionsScreen)
v5_5_eac_options.grid()

for Name in versions:
    versions[1]['Name'] = Variable()
    l = Checkbutton(v5_5_eac_options, text=versions[1]['Name'], variable=versions[1]['Name'])
    l.pack()

我希望复选框打印关联名称(即 5.5 - (EAC))而不是 PY_VAR01

非常感谢所有提供帮助的人。现在我修复了字典,大部分时间都可以正常工作了。

这是我更新的 for 循环代码,但它用相同的变量命名每个复选框,所以我需要再搞砸它。

for Name in versions[1]:
    var = Variable()
    l = Checkbutton(v5_5_eac_options, text=versions[1][4]['Name'], variable=var)
    l.pack()

【问题讨论】:

  • 您的versions dict 文字有很多重复键;只有给定键的最后一个值实际上存储在字典中。
  • 这应该是一个字典列表,或者你应该将名称和位置作为字典的键和值。
  • for Name in versions: 循环的目的是什么?你从不使用Name 变量,你在任何地方都硬编码了versions[1]
  • 你为什么要分配给version[1]['Name']?这将替换 versions 字典中的任何内容。
  • 您不应更改问题以匹配答案。现在答案没有意义了。

标签: python python-2.7 dictionary for-loop tkinter


【解决方案1】:

您不必使用 get。

此外,当一个键,比如名称在字典构造函数中重复时,只保留一个值。

versions = {1: {'Name': '5.5 - (EAC)', 'Location': '#',
                'Name': 'WS 2012 RS', 'Location': '#',
                'Name': 'Win 10 PRO V1607', 'Location': '#',
                'Name': 'TEST 1', 'Location': '#',
                'Name': 'TEST 2', 'Location': '#',
                'Name': 'Test 3', 'Location': '#',
                'Name': 'TEST 4', 'Location': '#',
                'Name': 'TEST 5', 'Location': '#'}}


print (versions)

结果

{1: {'Name': 'TEST 5', 'Location': '#'}}

所以你应该首先修改你的数据结构,例如嵌套数组,如

versions = {1: [{'Name': '5.5 - (EAC)', 'Location': '#'},
                {'Name': 'WS 2012 RS', 'Location': '#'},
                 ...],
            2:...
            }  

现在,要访问名称列表的第五个元素,测试 2,我们添加索引 4(python 列表从 0 开始)

text = version[1][4]['Name']

仅渲染最后一个版本,类似于

for record in versions[-1]:
    record['variable'] = IntVar()
    l = Checkbutton(v5_5_eac_options, text=record['Name'],   variable=record['variable']
    l.pack()

PS。我看到问题正在更新以匹配建议的答案

【讨论】:

  • 只是想了解 [4] 所引用的内容。感谢您迄今为止的帮助。
  • 我得到了这个错误。第 279 行,在 版本[1]['Name'] = Variable() TypeError: list indices must be integers, not str
  • @JordanHawkes 查看答案的最后一行。您需要索引字典列表。
  • @JordanHawkes 看起来你没有复制 [4]
  • 创建新变量 var 并将其放入 variable=var 而不是 variable=versions[1]['Name']
【解决方案2】:

首先,将字典设置为键:字典对列表:

versions = {
    1: [
        {'Name': '5.5 - (EAC)', 'Location': '#'},
        {'Name': 'WS 2012 RS', 'Location': '#'},
        {'Name': 'Win 10 PRO V1607', 'Location': '#'},
        {'Name': 'TEST 1', 'Location': '#'},
        {'Name': 'TEST 2', 'Location': '#'},
        {'Name': 'Test 3', 'Location': '#'},
        {'Name': 'TEST 4', 'Location': '#'},
        {'Name': 'TEST 5', 'Location': '#'}
    ],
    2: [
        {'Name': '5.5 - S', 'Location': '#'},
        {'Name': 'WS 2012 RS', 'Location': '#'},
        {'Name': 'Win 10 PRO V1607', 'Location': '#'},
        {'Name': 'TEST 1', 'Location': '#'},
        {'Name': 'TEST 2', 'Location': '#'},
        {'Name': 'Test 3', 'Location': '#'},
        {'Name': 'TEST 4', 'Location': '#'},
        {'Name': 'TEST 5', 'Location': '#'}
    ]
}

然后,您可以使用嵌套的 for 循环访问每个 Name

for index, version in in versions.items():
    for record in version:
        print(record['Name'])

由于我不确定您对本词典中的每个 indexrecord 做了什么,因此您需要将其映射到一个复选框,但您在应用程序中使用这些复选框。

编辑:

您希望根据您的编辑有两个单独的 for 循环。

for record in versions[1]:
    print record['Name']

for record in versions[2]:
    print record['Name']

【讨论】:

  • 当我这样做时,它表示索引中的记录:'int' 对象不可迭代
  • 编辑修复,字典元素可以通过items()访问
  • 啊该死的,所以我非常接近。现在唯一的问题是 for 循环正在打印所有名称(例如版本 1 和 2。我只希望它打印版本 1 的名称。版本 2 将使用单独的 for 循环,因为它们显示在不同的框架。也很抱歉我编辑了问题,这是发布代码的唯一方法。将返回以放置原始代码,以便您的分析器匹配。感谢您迄今为止的所有帮助。
  • 编辑回原始问题,只需要弄清楚如何只打印一个版本而不是两个版本。会玩一些东西。谢谢阿甘。
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多