如何在Python中获取最后按下的键?

7 投票
1 回答
3746 浏览
提问于 2025-04-18 05:35

首先,我想说我知道可以用curses来解决这个问题。
我的程序是一个每秒运行一次的循环。每秒我想获取最后一次被按下的键。所以如果在循环暂停的时候你按了一个键,我希望这个键能被保存下来,这样即使你不再按这个键,我也能知道最后按的是哪个键。我不希望保存的键在获取后被“删除”。所以当用户按下“a”键时,我希望每秒都能获取到这个键,直到他按下另一个键。如果按下了特定的键,我想打印一些文本。这些文本我想通过重定向标准输出(stdout)写入一个文件:

 ./test.py > file.txt

我用curses写的python程序看起来是这样的:

import curses
from time import sleep

stdscr=curses.initscr()
stdscr.nodelay(1)
curses.noecho()
curses.cbreak()

while True:
    char=stdscr.getch()
    if char == 111:        #111 = "o" key
        print("test")
        break
    elif char == 97        #97 = "a" key

        #code that have to be run every second
        #if the a key is the last pressed key!

    sleep(1)

curses.nocbreak()
curses.echo()
curses.endwin()

这个解决方案的问题在于,curses给我的输出很奇怪。我只按了一次“o”键,程序停止后,file.txt的内容看起来是这样的:

^[[?1049h^[[1;30r^[(B^[[m^[[4l^[[?7h^[[H^[[2Jtest
^[[30;1H^[[?1049l^M^[[?1l^[>

但它应该是这样的:

test

如果有人能写个答案,我会非常感激。我知道python并不是处理键盘事件的最佳选择,但我有我的理由选择python来做这个。

非常感谢大家的回答。

1 个回答

3

你可以安装并使用getch这个包。

import getch
from time import sleep
while True:
    char = getch.getch()
    if char == 111:
        print("test")
        break
    sleep(1)

(你可能需要用getch.getche,而不是getch.getch。从你的问题来看,这一点不是很明确)

撰写回答