在 tkinter 的列表框中传播字典

Propagate a dict in a Listbox of tkinter

我在 tkinter 列表框小部件中列出了字典 {'337':'Anderson','47':'Stuttgart' ...}。那对我有用。使用 curselection(),我还可以通过双击来获取像“Anderson”这样的值。

我的函数如下所示:

def select_xml(event):
    widget = event.widget
    selection = widget.curselection()
    value = widget.get(selection[0])
    print (value)

这个打印例如安德森.

问题:我的字典的key是不是丢失了,或者如何找回我选择的值的key。我找不到任何关于 dict 和 Listbox 的信息。

我不知道你是如何创建的 Listbox 但你可以将列表转换为

{'Anderson': '337', 'Stuttgart':'47' ...}

然后使用 Anderson 作为键得到 337

data = {'337':'Anderson', '47':'Stuttgart'}

data2 = {val:key for key,val in data.items()}

print(data2)

print(data2['Anderson'])

如果您在 dict 中多次使用相同的名称,那么转换可能会删除一些值,然后使用 list/dict comprehension

更好地过滤原始 dict
keys = [key for key,val in data.items() if val == 'Anderson']

print(keys)

但是如果你多次使用相同的名字,那么你会得到很多钥匙,你将不知道选择哪一把。最好使用 (key,values) 创建列表,然后使用 selection[0] 作为此列表中的索引

data = {'337':'Anderson', '47':'Stuttgart'}

data2 = [(key, val) for key,val in data.items()]

selection = [0]

print( data2[ selection[0] ] )

最少的工作代码

import tkinter as tk
        
# --- functions ---

def on_click(event):
    widget = event.widget
    sel = widget.curselection()
    val = widget.get(sel[0])
    
    print('dict2:', dict2[val])
    print('list2:', list2[sel[0]])
    print('---')

# --- main ---

data = {'337': 'Anderson', '47': 'Stuttgart'}

dict2 = {val:key for key, val in data.items()}
list2 = list(data.items())

root = tk.Tk()

listbox = tk.Listbox(root)
listbox.pack()

listbox.insert('end', *data.values())
listbox.bind('<Double-Button-1>', on_click)
             
root.mainloop()   

结果:

dict2: 47
list2: ('47', 'Stuttgart')
---
dict2: 337
list2: ('337', 'Anderson')
---