我正在创建一个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.7个guiutil.py
文件,另外还有一个新的虚拟键盘(python file,glade file)输入被选中。
我正在努力避免一个艰难的“以前被点击过吗?你刚刚失去焦点吗?你是否只是再次获得焦点,但你之前被点击过并且需要忽略这个焦点事件?”逻辑谜题。
答案 0 :(得分:0)
键盘焦点时将发出:: focus-in-event信号 进入小部件的窗口。
要接收此信号,与窗口小部件关联的GdkWindow需要 启用GDK_FOCUS_CHANGE_MASK掩码。
所以这是理想的行为。
要获得您想要的内容,您只需通过gtk_widget_is_focus(...)
检查所需的窗口小部件是否确实具有焦点(这与gtk_widget_has_focus(...)
- RTM不同,以获取详细信息)。