Привязать ввод ключа в python - PullRequest
0 голосов
/ 05 апреля 2020

В настоящее время я пишу приложение tui, используя picotui и python. Я пытаюсь создать поле ввода для пользователя с помощью виджета «WTextEntry», но не могу понять, как получить данные из окна, когда я нажимаю клавишу ввода. Каков наилучший способ связать клавишу ввода (в идеале без внешних библиотек), чтобы она работала так:

e = WTextEntry(100, "")
d.add(22, 40, e)
if("enter key is pressed"):
     e.get()

Любая помощь с этим будет оценена.

1 Ответ

0 голосов
/ 05 апреля 2020

Виджеты и редакторы из picotui поддерживают сигналы и обработчики сигналов. Это означает, что можно обрабатывать событие, инициируемое пользователем, например нажатие клавиши enter.

# I'm assuming you already have a dialog at this point

def handle_enter(w):
    print(w)

e = WTextEntry(100, "")
d.add(22, 40, e)

e.on("enter", handle_enter)

Наиболее важным предварительным условием является то, что код выполняется внутри основного l oop. Код, который вы пишете, должен запускаться внутри бесконечного l oop, который использует aws виджетов и собирает пользовательские данные. Без такого бесконечного l oop ваш код завершает работу сразу после прорисовки всего, и вы не получаете изменений для обработки сигналов. Библиотека предоставляет основной l oop, вам нужно обязательно его запустить.

def handle_enter(w):
    print(w)

e = WTextEntry(100, "")
d.add(22, 40, e)

e.on("enter", handle_enter)

res = d.loop()

Метод d.loop() - это то, что запускает бесконечный основной l oop и позволяет обрабатывать события .

РЕДАКТИРОВАТЬ: Несмотря на то, что замечания в исходном ответе верны, кажется, что виджет WTextEntry не поддерживает сигнал enter. Это видно из исходного кода , так как обработка ключа KEY_ENTER пропущена.

Кажется, что решение состоит в том, чтобы создать кнопку и обработать ее сигнал click. Внутри обработчика сигнала для кнопки можно также обрабатывать ввод текста.

Вот краткий пример:

from picotui.context import Context
from picotui.screen import Screen
from picotui.widgets import *


def handle_click(w):
    with open('test.txt', 'w') as f:
        f.write(e.t)


with Context():

    d = Dialog(5, 5, 50, 12)

    d.add(1, 1, "Entry:")

    e = WTextEntry(100, "Text")
    d.add(10, 1, e)

    b = WButton(10, "Click")
    d.add(10, 10, b)
    b.on("click", handle_click)

    res = d.loop()
...