Curses正在检测以前按下的键

2024-09-30 22:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

这感觉像是一个非常琐碎的问题,但经过数小时的搜索和实验,我无法找到一个单一的解决方案

我用咒语用键盘键移动我的机器人,它按预期工作,但有一件事,每次点击“getch()”时,它会执行之前按下的键,即使没有按下任何键,这会造成“滞后”情况

这是一个非常简单的场景,我创建来解释我自己,在这里让我们说,我按下“a”,它工作正常,我保持按下约4秒,然后释放,现在,即使没有按下任何按钮,此代码也会一次又一次地执行,因为curses会对我在此期间按下的所有“a”执行x次。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()

如果可能的话,一些不会强迫我杀死并重新启动一切的东西


Tags: keyimporttimedef场景sleepcursesprint
1条回答
网友
1楼 · 发布于 2024-09-30 22:20:18

看来你需要curses.flushinp()

Flush all input buffers. This throws away any typeahead that has been typed by the user and has not yet been processed by the program.


最终,您可以尝试删除重复的关键点

new_key = stdscr.getch()

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

key = new_key

(在回答Configure key repeat delay to detect if key is being pressedC代码中找到)

相关问题 更多 >