EVT_TEXT事件上的.Skip()做了什么吗?

时间:2018-05-23 14:08:36

标签: python wxpython wxwidgets

.Bind(...)附加的

wx event handlers作为参数接收具有.Skip()方法的事件对象。调用.Skip()可以使事件的默认行为发生;附加不调用.Skip()的处理程序会抑制默认行为。例如,没有调用EVT_CHAR的{​​{1}}处理程序会抑制将字符输入字段的默认行为,从而阻止用户输入。

.Skip()怎么样?它有任何默认行为吗?它不会似乎 - 无论我是否呼叫EVT_TEXT,在EVT_TEXT处理程序出现的字段中输入行为都相同或不。但是,是否有一些边缘情况或非显而易见的影响受到我是否呼叫.Skip()的影响,因此应该决定是否要调用它?

2 个答案:

答案 0 :(得分:1)

不调用wxEvent::Skip()会做两个相关但不同的事情:它会阻止底层UI工具箱中的默认事件处理程序处理它,它还会阻止您自己代码中同一事件的任何其他处理程序处理它

第一个方面对命令事件确实不重要,命令事件通常在工具包级别没有任何默认事件处理程序。但是,第二个仍然是,特别是因为默认情况下命令事件会向上冒泡窗口层次结构。

因此,如果您将一些处理程序绑定到文本控件并且恰好在帧级别捕获所有wxEVT_TEXT处理程序,则可以轻松地看到调用Skip()之间的区别:框架处理程序只会在你调用它时获取事件。

从实际的角度来看,您通常想跳过命令事件处理程序,因为它们应该只处理一次。但它不是绝对的阻截,有些情况下你仍然可以这样做,例如如果你的事件处理程序没有对这个特定事件做任何事情。

答案 1 :(得分:0)

一般来说,在事件处理程序中调用Skip()只对非wxCommandEvent处理程序有意义。您可以让处理程序完成,程序将执行下一个事件迭代。

由于wxEVT_TEXT是wxCommandEvent事件,因此调用Skip()没有多大意义。

然而,不在非wxCommandEvent上调用Skip()是不好的,如果你省略这样的调用,你真的应该知道你在做什么。