Curses определяет предыдущие нажатые клавиши - PullRequest
0 голосов
/ 27 мая 2020

это кажется очень тривиальной проблемой, но после нескольких часов поиска и экспериментов я не смог найти единственное решение.

Я использую проклятия, чтобы перемещать своего робота с помощью клавиш клавиатуры, он работает как задумано но, во-первых, каждый раз, когда выполняется «getch ()», он выполняет предыдущие нажатые клавиши, даже если ничего не нажимается, что создает ситуацию «запаздывания».

Это очень простой сценарий, который Я создал, чтобы объяснить себя, здесь, скажем, я нажимаю 'a', который работает правильно, я держу его нажатым еще около 4 секунд и отпускаю, теперь этот код будет выполняться снова и снова, даже если ничего не нажимается, потому что curses выполнит его x раз для всех нажатых мною за это времени 'a'. sleep:

import curses
import time
stdscr = None

def SetupCurses():
    global stdscr
    stdscr = curses.initscr()
    curses.cbreak()
    stdscr.keypad(1)


def StartCurse():

    key = ''
    while key != ord('q'):
        stdscr.clear()
        stdscr.refresh()
        key = stdscr.getch()
        if key == ord('a'):
            print("\nyou pressed a\n")
            time.sleep(5)
            print("\nyou can press a again\n")
            time.sleep(1)

while(True):
    SetupCurses()
    StartCurse()

Итак, я подумал, ну, я не хотел этого делать, но я полностью убью проклятия и подключите его снова, прежде чем проверять ключи, но даже после этого проклятия, похоже, собирают ключи, которые не должны (и мне это очень не нравится в любом случае, я чувствую, что мне не нужно закрывать его вот так, если я буду использовать его снова и снова), этот сценарий будет иметь ту же проблему, что и сценарий выше:

import curses
import time
stdscr = None

def SetupCurses():
    global stdscr
    stdscr = curses.initscr()
    curses.cbreak()
    stdscr.keypad(1)


def StartCurse():

    key = ''
    while key != ord('q'):
        stdscr.clear()
        stdscr.refresh()
        key = stdscr.getch()
        if key == ord('a'):
            break

def EndCurse():
    global stdscr
    curses.nocbreak()
    stdscr.keypad(False)
    curses.echo()
    curses.endwin()
    stdscr = None

while(True):  
    SetupCurses()

    print("\nyou can press a again\n")
    time.sleep(1)

    StartCurse()  
    EndCurse()

    time.sleep(5)
    print("\nyou pressed a\n")

Мой вопрос: есть ли какой-то код, который делает:

curses.ClearAnyPreviousInput()
ThisKeyIsBeingPressedRightNow = stdscr.getch()

если возможно, что-то, что не заставляет меня убивать и перезапускать все снова

1 Ответ

1 голос
/ 27 мая 2020

Кажется, вам нужны curses.flushinp ()

Flu sh все входные буферы. Это отбрасывает все напечатанные символы, которые были введены пользователем и еще не были обработаны программой.


В конце концов вы можете попытаться удалить повторяющиеся клавиши

new_key = stdscr.getch()

while new_key == key:
      new_key = stdscr.getch()

key = new_key

(находится в коде C в ответе на Настроить задержку повтора клавиш, чтобы определять, нажата ли клавиша )

...