4

我正在尝试扩展 ttk::combobox 的行为,使其行为类似于我浏览器中的 Google 搜索框 - 即我希望它自动下拉并将列表框中的条目限制为与字符串匹配的条目到目前为止,我已经输入了。最终,我想选择已自动完成的字符串部分,以便用户键入的下一个字符将导致它被删除并重新开始匹配过程。

我在Tcler 的 wiki上找到了该页面,但这似乎选择了带有刚刚输入的字母的条目,这不是我想要的。(假设用户从美国各州列表中进行选择。当他们输入 A 时,我希望选择仅限于阿拉巴马州、阿拉斯加州、亚利桑那州和阿肯色州;当他们随后输入 L 时,列表应仅限于阿拉巴马州和阿拉斯加州。 wiki 上的代码会在用户输入 A 时选择 Alabama,然后在用户输入 L 时选择 Louisiana。)

我尝试在 ttk::combobox 上定义一些绑定,但放弃了 - 老实说,我不记得为什么 - 并尝试扩展 ttk::entry 的行为以覆盖它。

从 ttk/combobox.tcl 大量借用后,我设法发布了一个列表框并限制了列表框中的条目,但是现在我已经添加了绑定以使向上和向下箭头改变选择,因此遇到了大问题。准确的说,选中的item被愉快的移动了,但是有时候entry widget失去焦点时候,整个应用程序挂掉了,我的tclsh把所有的cpu都吸干了。

我正在 Windows 和 Linux 上使用 ActiveTcl 8.6 进行开发,并且代码在两个平台上的行为似乎相同,尽管我没有在 Linux 上尝试过,因为我第一次看到它没有挂在 Windows 中。我很乐意分享我的代码,但由于演示脚本运行到大约 450 行,如果其他人发布了那么多,我不会自己阅读它。

任何人都可以通过提出正确的问题为我点亮灯泡来提供帮助吗?这个问题感觉像是一个时间问题,但我不知道从哪里开始尝试追踪它。

非常感谢。

编辑我一直在绞尽脑汁,我认为我放弃尝试扩展 ttk::combobx 的原因是因为已经有大量绑定到位,而且有些做了我不想要的事情。当前的工作在入口小部件和 Key-Up、Key-Down、FocusIn 和 FocusOut 绑定上使用validatecommand 。

当前代码在此处的 pastebin 上。

4

1 回答 1

2

嗯,那太尴尬了!

我又看了一下wiki 上的代码,发现它做了我最想做的事情。它不会发布列表框,但会自动完成,如果您尝试导航(未发布的)列表框,通过按向上键或向下键,它会以突出显示的相应项目开始。

这足以满足我的需要;如果我决定我真的必须张贴列表框,我可以在当时看到。(但是,鉴于我尝试自己动手的糟糕经历,我怀疑我会忍受这个。)

非常感谢您的宽容和建议。

于 2013-05-31T12:32:27.983 回答