如何使用字典键设置tkinter组合框的值

4
root = Tk()
my_dict = {'Drosophila melanogaster':1
           'Danio rerio': 2,
           'Caenorhabditis elegans':3,
           'Rattus norvegicus': 4,
           'Mus musculus': 5,
           'Homo sapiens': 6,
           }
combobox_values = "\n".join(my_dict.keys())
organism = ttk.Combobox(root, values=combobox_values) 
organism.grid(row=2, column=0, sticky="w", padx=2, pady=2)

我正在尝试将每个字典键作为组合框中的选项,但是当我运行脚本时,每个单词都变成了一个单独的选项。如果有人能告诉我我做错了什么,我会非常感激。

2个回答

9

你非常接近了!

combobox_values = "\n".join(my_dict.keys())

应该是

combobox_values = my_dict.keys()

使用join,您可以将字典中的所有键放入一个字符串中!当Tkinter尝试分隔您的字符串时,它会决定使用空格来分割项目,这样与换行符一样好用。

我花了一些功夫才找到底层使用的分界线。官方文档没有提到这点

检查源代码,Combobox 继承自 Entry 小部件,但两者都直接调用底层的 tcl。New Mexico(通常是可靠的)声称值需要在列表中,但显然字符串也可以。由于 Python 中字符串和列表非常相似,ttk 采取的故障安全方法似乎很合适... 但这并没有回答问题...

实际上,这里有一个有趣的游戏:尝试打破构造函数。传递一个随机数?以下所有内容都有效。

ttk.Combobox(root, values=12345) 
class Foo:pass
ttk.Combobox(root, values=Foo())
ttk.Combobox(root, values=Foo)

经过进一步调查,最终的Python调用发生在Tkinter.py的第2058行(或者说是实现相关)。如果你真的好奇,你可以从tcl docs中追踪到他们详细的小部件部分,特别是章节“保留额外项目数据”,以了解这些事情发生的原因和方式。
在后两个例子中,显示方法清楚地表明,输入被包装为其自身的字符串表示形式(符合新墨西哥州的解释),但底层方法仍然含糊不清。

0
尝试使用 combobox_values = list(my_dict.keys()),因为我在 Python 3.8 中没有得到预期的结果。

这已经在这里建议过了(https://dev59.com/bZjga4cB1Zd3GeqPExHG#37849888)。 - rachwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接