为什么我的绑定会被阻止?

时间:2014-04-18 09:23:41

标签: tcl

我正在从头开始重写一个已经正在运行的应用程序,我的几个模块遇到了一个奇怪的障碍。目前,它唯一能做的就是将CSV文件读入字典,设置GUI,然后将字典写回CSV。 GUI应该打开文档窗口,用于选择字典中的项目,因为它们被要求:目前我只是希望它在按Return键时打开所有项目的窗口。

昨天它的工作方式应该如此。今天我对CSV读取/保存命令进行了一些更改,突然主窗口不再响应了。我对这些更改有一个确切的区别,但它们都不会影响事件处理。

绑定看起来像这样:

bind . <Escape> {exec wish $argv0 &; exit}
bind . <?> {catch {console show} ; ::log::lvSuppressLE warning 0}
bind . <Return> IDB::GUI::openwindow

我在维基上看过SO,并在网上搜索,但如果之前已经讨论过,我似乎错过了它。除其他事项外,我已尝试调用update并使用bindtags来确定绑定的优先级。这些都不起作用,如果我在绑定后添加它:

tk_messageBox -message foo

它就像一个魅力:当我按下按键时,所有绑定都会激活。显然,消息框清除阻止事件传递的东西,但我无法弄清楚它是什么。

我非常希望避免发布一个无意义的消息框,只是为了让我的应用程序做出响应。

不要告诉我上帝在耶稣受难日工作会惩罚我。

ETA:设置GUI后的消息框似乎还不够,我在设置之前还需要一个消息框。当我删除那个时,事件再次停止工作。

获得答案后进行编辑:简单的focus .似乎足以让我的主窗口保持响应。为了更好的衡量,我添加了另一个绑定bind . <Button-1> {focus .},我希望这可以让我恢复焦点,如果有什么东西再次转移它。我也可以在应用程序日志记录中添加一些焦点内省。

(编辑的编辑:当然,如果一个人放入绑定bind . <Button-1> {focus .},一旦开始向GUI添加例如条目小部件,它会非常有助于记住将其取出:否则人们可能会想知道为什么会这样做点击它们时,条目不会得到焦点。简单?我当然是。)

正如Donal指出的那样,<?>不是有效的事件代码(它应该类似于<Key-question>)。它适用于我,但如果您决定重复使用该特定绑定,请记住它不会以任何方式保证为您工作。

2 个答案:

答案 0 :(得分:1)

听起来你的主窗口根本没有键盘焦点。弹出消息框然后解除它可能会产生将焦点设置到主窗口的副作用。

尝试明确将注意力设置在.

答案 1 :(得分:1)

最可能的问题是你没有把焦点放在你期望的地方,或者你有一个break冒出一个你没想到的绑定(因为绑定在{{ 1}}通常是相当低的优先级。)

如果您知道焦点位于何处(并且您认为它应该在哪里!),请检查.以及每个绑定标签上的绑定列表。以下是如何查看所有内容 ...

bindtags

还要注意哪些虚拟事件映射到; set w [focus] puts "For window $w..." foreach tag [bindtags $w] { foreach sequence [bind $tag] { puts [list bind $tag $sequence [bind $tag $sequence]] } } 会告诉你真正的键会触发它。 (当它们都试图处理相同的实际事件时,真实事件和虚拟事件之间存在复杂的交互;我无法安全地预测那里发生的事情,并试图避免它。)并非所有虚拟事件都必须具有 any < / em>键绑定;有些是直接从代码event info <<TheVirtualEvent>>发出的。