Tkinter控件中的对象:如何超越StringVar、IntVar、DoubleVar和BooleanVar?
我正在尝试用Tkinter写一个图形界面,目的是从几个复杂的Python对象中选择一个。这些对象代表数据库中的记录;如果需要的话,我可以根据它们的唯一整数ID从一个映射中恢复这些对象。
在理想情况下,Listbox和OptionMenu这些控件应该能接受一系列任意对象,并且能提供一个函数,用来从这些对象中获取要显示的字符串;而它们的变量应该直接给出这些对象,而不需要进行多余的转换。
但是,实际上没有任何控件,尤其是没有变量类型,能处理除了字符串、数字和布尔值以外的其他东西。我无法把我的对象找回来,也不能仅仅用ID值来创建一个列表,因为那样显示的只是ID,而不是一个有意义的字符串表示。
作为测试,我在OptionMenu中放了元组,并用StringVar来处理,结果它们被转换成了字符串。
有没有什么特别的控件或技巧,可以让我从变量中获取对象,或者在控件中显示一个与变量内容不同的字符串?我想到的最好方法是用动态生成的lambda函数来填充菜单,但这样看起来会很复杂,而且可能会太大。
1 个回答
0
为了解决这个问题,至少对我的列表框来说,我创建了一个数组来表示列表中的所有数据。假设 complexobjects
是你的对象列表,
for obj in complexobjects:
listbox.insert(END, str(complexobjects))
把 str(complexobjects)
替换成你想要的字符串表示方式。你不需要存储它或者查找它,只需使用索引就可以了,
selitems = [complexobjects[int(idx)] for idx in listbox.curselection()]