Python跨平台监听按键吗?
我想在一个Python终端程序中监听特定的按键,但不想用raw_input
来暂停程序的执行。我看到有些人用了一些Windows特有的方法来监听按键,还有人使用像tkinter和pygame这样的大模块,但我想避免使用这些。
有没有什么轻量级的模块可以在不同平台上使用(至少是Ubuntu、Windows和Mac)?或者有没有办法只用tkinter、pygame等的事件系统呢?
如果没有,那我该怎么解决这个问题呢?我最初的想法是把标准输入重定向到另一个进程,然后不断检查里面是否包含我的事件按键。
编辑
感谢@unutbu花时间标记这个已经三年的问题,并成功地将其标记为另一个问题的重复,因为我特别询问的是一个非阻塞的解决方案,而那个问题的答案并不适用。
4 个回答
你可以使用Python的一个模块叫做platform,来获取当前的操作系统信息,然后针对每种操作系统制定相应的解决方案:
import platform
platform.platform()
'Linux-3.3.0-8.fc16.x86_64-x86_64-with-fedora-16-Verne'
简单来说:不可以。
按键输入是跟系统有关的,属于中断驱动的。这是大多数现代操作系统里的一些基本功能。不同的系统有不同的处理方式,想要统一成一种通用的方法是行不通的,因为这样会失去一些功能。
你可以试试:
termios = 这是在类Unix系统中使用的一种文件描述符驱动的方式。
curses = 这是一种特定的控制台处理方式,类似于门户终端的风格,不是通用的。
在Python中,有一些类可以处理来自键盘的输入,比如,sys.stdin 用于控制台输入。
但是,想要获取一种通用的键盘输入是个很复杂的问题,因为它本质上是依赖于不同的平台的。
我不知道有没有什么轻量级的跨平台模块可以监听按键。不过,如果你想实现一个简单的功能,这里有个建议:
你可以看看这个关于在Python常见问题解答中如何“一次获取一个按键”的问题。你可以尝试使用 sys.stdin
和 threading
来进行一些实验。不过,这可能只在Unix系统上有效。在Windows上,你可以使用 msvcrt.kbhit
。
结合Python常见问题解答中的按键处理方法和 msvcrt
模块,最终的 kbhit
函数可以这样写:
try:
from msvcrt import kbhit
except ImportError:
import termios, fcntl, sys, os
def kbhit():
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
try:
while True:
try:
c = sys.stdin.read(1)
return True
except IOError:
return False
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)