Python Tkinter控件中的对象:如何超越StringVar、IntVar、DoubleVar、BooleanVar?

Python Tkinter控件中的对象:如何超越StringVar、IntVar、DoubleVar、BooleanVar?,python,tkinter,Python,Tkinter,我正试图用Tkinter编写一个GUI,从几个复杂的Python对象中选择一个。它们表示数据库中的记录;如果需要,我可以从给定整数唯一id的映射中恢复对象 在理想情况下,Listbox和OptionMenu小部件将接受一系列任意对象和一个要调用的函数,以从这些任意对象获取要显示的字符串;它们的变量将给出其中一个对象,而不会进行不必要的转换 相反,除了字符串或转换为数字和真值的字符串之外,没有任何小部件,更重要的是,没有任何变量类型处理任何其他内容。 我无法取回任意对象,也无法创建包含id值的列表

我正试图用Tkinter编写一个GUI,从几个复杂的Python对象中选择一个。它们表示数据库中的记录;如果需要,我可以从给定整数唯一id的映射中恢复对象

在理想情况下,Listbox和OptionMenu小部件将接受一系列任意对象和一个要调用的函数,以从这些任意对象获取要显示的字符串;它们的变量将给出其中一个对象,而不会进行不必要的转换

相反,除了字符串或转换为数字和真值的字符串之外,没有任何小部件,更重要的是,没有任何变量类型处理任何其他内容。 我无法取回任意对象,也无法创建包含id值的列表,因为它们将显示id,而不是合理的字符串表示形式

作为测试,我将元组放在带有StringVar的OptionMenu中,并将它们转换为字符串

是否有一些奇特的小部件或技术可以用来从变量中获取()对象,或者在小部件中显示一个字符串,而不是放在小部件变量中的字符串?
我能想到的最好的方法是一个充满动态生成的命令lambda的菜单,但它会很难看,而且可能太大。

我解决了这个问题,至少对于我的列表框来说,是使用一个数组来表示列表中的所有数据。假设
complexobjects
是您的对象列表

for obj in complexobjects:
    listbox.insert(END, str(complexobjects))
用您想要的字符串替换
str(complexObject)
待批准的代表性。您不需要存储或查找它,只需使用 索引


阅读本页,

从每个对象获得的字符串是否唯一?在这种情况下,这太容易了。这种方法的问题是它限制了insert()调用,因为我们必须猜测列表框中项目的索引;无法使其表现得像接受任意insert()调用的普通Listbox子类。我希望绕过常规Tkinter的一小部分,创建一个可重用的Listbox子类,但我认为我应该填充隐藏在某个复合小部件中的特殊Listbox。这并不一定能阻止您进行任意插入。这很容易做到,对吗?我的意思是,您可以很容易地将TKinter listbox对象子类化,或者您可以自己创建一个类,让该类的一个成员成为允许任意插入的listbox的实例。
selitems = [complexobjects[int(idx)] for idx in listbox.curselection()]