【问题标题】:Hidden id on tkInter ListboxtkInter 列表框上的隐藏 id
【发布时间】:2012-05-25 09:20:41
【问题描述】:

我想知道是否有可能以某种方式将隐藏的 id 与列表框中的每个条目一起存储。这样做的原因是我有一个表,其中包含一个来自数据库的唯一 ID(用户不可见,但用于唯一标识每条记录)我将表缓存在内存中并使用键控字典身份证

我想创建一个允许我选择其中一条记录的列表框 - 显示的文本不是唯一的 id,而是一个描述性字段(例如“名称”),它可能是唯一的,但这不是强制的并且没有索引。例如,如果我有:

Id  Name
--  ----
 2  Rod
 5  Jane
15  Freddy

然后选择Jane,我就可以轻松访问id5

我的问题是我找不到将唯一 ID (5) 与选择 (Jane) 相关联的方法,以便我可以轻松识别缓存记录。我知道我可以使用控制变量,但这只是给了我列表中所有字符串的列表——不是我想要的。此外,索引(例如插入时)似乎不可靠。

我设法做到这一点的唯一方法是让另一个字典将名称映射到 id。由于多种原因,这是次优的。

我在这里遗漏了什么吗?有没有更简单的方法?

【问题讨论】:

  • 您的意思是 id 5 代表 Jane2 代表 Rod,对吧? :-P
  • @MartijnPieters:是的,很抱歉。现在更正了。

标签: python listbox tkinter


【解决方案1】:

将您的 id 保存在一个列表中,然后使用 .curselection() 索引将它们映射回行 id,只要您保持顺序相同。

在您的示例中,Jane 是列表中的第二个选项,因此如果选择 .curselection(),则返回 1。如果您有一个相同顺序的rowids 列表,则rowids[1] 将是5

>>> rowids = [2, 5, 15]
>>> rowids[listbox.curselection()]
5

比将名称映射到字典中的 rowid 效率略高。

【讨论】:

  • 谢谢。我没有提到的另一个复杂性是我可能必须处理删除/插入。我越来越希望我需要大量的样板代码来管理“模型”和“视图”之间的关系。例如,似乎没有任何工具可以对插入进行排序——这很容易做到,但您认为这是一个足够普遍的要求,值得将功能添加到容器中。也许我只是期望太高。
  • 是的,对于 ListBox,您需要包含一个体面的模型类来保持排序并跟踪索引和行 ID 之间的关系。
【解决方案2】:

如果您使用ttk.Treeview 小部件而不是列表框,则可以将 id 存储在不可见的列中。

【讨论】:

  • 不幸的是,我使用的是 Python 2.6.2,它似乎不支持 Treeview - 真是太可惜了,而且我无法控制版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
相关资源
最近更新 更多