Python Gtk.EntryCompletion()用于解决键绑定冲突的弹出状态

Python Gtk.EntryCompletion()用于解决键绑定冲突的弹出状态,python,python-3.x,gtk,gtk3,pygobject,Python,Python 3.x,Gtk,Gtk3,Pygobject,我有Gtk.Entry()和Gtk.EntryCompletion(),我绑定了箭头键以执行不同的功能,即像在终端中一样在命令历史中导航 但是完成弹出窗口上的导航将与历史导航冲突,是否有任何方法检查完成弹出窗口是否可见/处于活动状态,以便我们可以打开历史导航 另外,是否有办法获得完成弹出窗口的总匹配计数 下面是示例程序 #!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository im

我有Gtk.Entry()Gtk.EntryCompletion(),我绑定了箭头键以执行不同的功能,即像在终端中一样在命令历史中导航

但是完成弹出窗口上的导航将与历史导航冲突,是否有任何方法检查完成弹出窗口是否可见/处于活动状态,以便我们可以打开历史导航

另外,是否有办法获得完成弹出窗口的总匹配计数

下面是示例程序

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk

entry = Gtk.Entry()

def on_key_press(widget, event):
    # NOTE to stop propagation of signal return True
    if   event.keyval == 65362: widget.set_text("history -1") # Up-arrow
    elif event.keyval == 65364: widget.set_text("history +1") # Down-arrow

entry.connect('key_press_event', on_key_press)

entrycompletion = Gtk.EntryCompletion()
entry.set_completion(entrycompletion)

liststore = Gtk.ListStore(str)
for row in "entry complete key conflit with history".split():
    liststore.append([row])

entrycompletion.set_model(liststore)
entrycompletion.set_text_column(0)

root = Gtk.Window()
root.add(entry)
root.connect('delete-event', Gtk.main_quit)
root.show_all()
Gtk.main()

您需要使用
entrycompletion将内联选择选项设置为
True
。设置内联选择(True)
。这将把按键事件连接到完成弹出菜单

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk

entry = Gtk.Entry()

def on_key_press(widget, event):
    # NOTE to stop propagation of signal return True
    if   event.keyval == 65362: widget.set_text("history -1") # Up-arrow
    elif event.keyval == 65364: widget.set_text("history +1") # Down-arrow

entry.connect('key_press_event', on_key_press)

entrycompletion = Gtk.EntryCompletion()
entrycompletion.set_inline_selection(True) #enables selection with up and down arrows
entry.set_completion(entrycompletion)

liststore = Gtk.ListStore(str)
for row in "entry complete key conflit with history".split():
    liststore.append([row])

entrycompletion.set_model(liststore)
entrycompletion.set_text_column(0)

root = Gtk.Window()
root.add(entry)
root.connect('delete-event', Gtk.main_quit)
root.show_all()
Gtk.main()

非常感谢,这个问题太令人沮丧了,没能解决这个问题。终于完全解决了,现在我可以安心睡觉了。当没有匹配项时,存在失去输入焦点的问题,如果我停止信号传播,如果我的输入焦点丢失,则无法导航自动完成建议。由于光标仅在用户定义的按键按下事件之后才显示匹配信号。使用Gtk.Widget的焦点信号解决了这个问题