【问题标题】:focus-in-event fires even when entry is not focused即使条目没有聚焦,focus-in-event 也会触发
【发布时间】:2014-04-23 22:40:23
【问题描述】:

我正在创建一个 gtk.Entry,并且想挂接到它的“focus in”事件,所以我可以弹出一个虚拟键盘:

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. ...

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

虚拟键盘窗口关闭后,我会看到带有 self.entry 更新值的原始窗口。但是,如果我在原始窗口(甚至不是 gtk.Entry)上点击 anywhere,则会触发相同的回调并再次显示虚拟键盘。

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

编辑

这来自wicd 1.7guiutil.py 文件中的modified version,以及一个新的虚拟键盘(python fileglade file),只要选择一个条目,它就会打开。

我试图避免一个艰巨的“以前是否曾点击过此焦点?您是否刚刚失去焦点?您是否刚刚再次获得焦点,但您之前曾被点击过并且需要忽略此焦点事件?”逻辑谜题。

【问题讨论】:

  • 您使用的是pygtk 还是girepository?您能否提供一个重现您的问题的最小示例?
  • 我正在使用pygtk。它实际上是wicd gtk UI 的修改版本。我在源代码中添加了一些 pastebin 文件。

标签: python events gtk pygtk


【解决方案1】:

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

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

所以这是期望的行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2017-01-16
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多