Gtk.EntryCompletion() всплывающее состояние для разрешения конфликта клавиш

У меня есть Gtk.Entry() с Gtk.EntryCompletion (), я связал клавишу со стрелками для выполнения другой функции, т.е. навигации по истории команд, как в терминале.

Но навигация во всплывающем окне завершения будет конфликтовать с навигацией по истории. Есть ли способ проверить, является ли всплывающее окно завершения видимым / активным, чтобы мы могли повернуть навигацию по истории.

Плюс, есть ли способ получить общее количество совпадений в Completion Popup.

Ниже приведен пример программы.

#!/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()

1 ответ

Решение

Вам нужно установить опцию встроенного выбора True с entrycompletion.set_inline_selection(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()
Другие вопросы по тегам