【问题标题】:Objects from Tkinter controls: how to go beyond StringVar, IntVar, DoubleVar, BooleanVar?来自 Tkinter 控件的对象:如何超越 StringVar、IntVar、DoubleVar、BooleanVar?
【发布时间】:2011-06-05 11:36:06
【问题描述】:

我正在尝试在 Tkinter 中编写一个 GUI,以便从几个复杂的 Python 对象中选择一个。它们代表数据库中的记录;如果需要,我可以从给定整数唯一 ID 的地图中恢复对象。

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

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

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

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

【问题讨论】:

  • 每个对象得到的字符串是否唯一?
  • 这样的话就太容易了。

标签: python tkinter


【解决方案1】:

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

for obj in complexobjects:
    listbox.insert(END, str(complexobjects))

用你想要的字符串替换str(complexobjects) 代表。您不需要存储或查找它,只需使用 索引,

selitems = [complexobjects[int(idx)] for idx in listbox.curselection()]

阅读此页面,http://effbot.org/tkinterbook/listbox.htm

【讨论】:

  • 这种方法的问题是它限制了 insert() 调用,因为我们必须猜测列表框中项目的索引;没有办法让它表现得像一个接受任意 insert() 调用的普通 Listbox 子类。我希望绕过常规 Tkinter 的一小部分并创建一个可重用的列表框子类,但我想我会填充隐藏在一些复合小部件中的临时列表框。
  • 这并不一定会阻止您进行任意插入。这很容易做到吗?我的意思是,您可以轻松地将 TKinter 列表框对象子类化,或者您可以自己创建并让该类的成员成为允许任意插入的列表框的实例。
猜你喜欢
  • 2018-08-29
  • 2022-01-28
  • 1970-01-01
  • 2014-10-10
  • 2011-05-02
  • 1970-01-01
  • 2022-01-14
  • 2022-01-08
相关资源
最近更新 更多