即使在没有集中注意力的情况下,焦点事件也会引发

时间:2014-04-23 22:40:24

标签: python events gtk pygtk

我正在创建一个gtk.Entry,想要挂钩它的“焦点”事件,所以我可以弹出一个虚拟键盘:

class LabelEntry(gtk.HBox):
    # ... initialization ...

    self.keyboard = virtualkeyboard.VirtualKeyboard()
    self.entry = gtk.Entry()
    self.entry.connect('focus-in-event', self.keyboard.focus_handler)

    # ... attach the gtk.Entry to this gtk.HBox, etc. ...

这会正确打开focus_handler类中包含的VirtualKeyboard回调,并在当前顶部显示一个新窗口。

解除虚拟键盘窗口后,我会看到原始窗口,其中包含self.entry的更新值。但是,如果我点击原始窗口上的 where (甚至不在gtk.Entry上,则会触发相同的回调并再次显示虚拟键盘。

什么会导致原始窗口上任何位置的触摸被注册为gtk.Entry的“焦点”事件?打开新窗口时是否需要模糊焦点,或者创建一个标志,指示我已经打开窗口而不应该再打开它?

修改

这来自modified version wicd 1.7guiutil.py文件,另外还有一个新的虚拟键盘(python fileglade file)输入被选中。

我正在努力避免一个艰难的“以前被点击过吗?你刚刚失去焦点吗?你是否只是再次获得焦点,但你之前被点击过并且需要忽略这个焦点事件?”逻辑谜题。

1 个答案:

答案 0 :(得分:0)

  

键盘焦点时将发出:: focus-in-event信号   进入小部件的窗口

     

要接收此信号,与窗口小部件关联的GdkWindow需要   启用GDK_FOCUS_CHANGE_MASK掩码。

所以这是理想的行为。

要获得您想要的内容,您只需通过gtk_widget_is_focus(...)检查所需的窗口小部件是否确实具有焦点(这与gtk_widget_has_focus(...) - RTM不同,以获取详细信息)。