【发布时间】: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.7 的guiutil.py 文件中的modified version,以及一个新的虚拟键盘(python file、glade file),只要选择一个条目,它就会打开。
我试图避免一个艰巨的“以前是否曾点击过此焦点?您是否刚刚失去焦点?您是否刚刚再次获得焦点,但您之前曾被点击过并且需要忽略此焦点事件?”逻辑谜题。
【问题讨论】:
-
您使用的是
pygtk还是girepository?您能否提供一个重现您的问题的最小示例? -
我正在使用
pygtk。它实际上是wicdgtk UI 的修改版本。我在源代码中添加了一些 pastebin 文件。