我在Windows7系统上使用Python 3.6.4 (我还有Win 10和Android等其他系统,但这是我的起点)。
对于那些不熟悉BASIC (几乎任何风格)的人来说,INKEY$是一个检查键盘缓冲区的函数,如果没有数据,则以字符串或null/空值("")的形式返回数据,并清除缓冲区。返回字符串的长度取决于缓冲区中的数据,通常是0、1或2,只需一次击键(在过去,速度快的打字员可以在两次检查之间填充较小的缓冲区)。Enter键是不需要的(除非这就是您要找的),也不会被处理,程序不会暂停,除非编程这样做。
Pauser:
a$=""
while a$=""
a$=inkey$
wend
Flow Interrupter:
a=0
while a < 1000
a=a+1
print a
a$=inkey$
if a$<>"" then exit while
wend
快速解析器:
a$=inkey$
if a$<>"" then
rem process input
rem like arrow keys/a w s z for directional movement
rem useful for games and custom editors
end if
我想知道Python是否有一个简单的跨平台函数(即不是10+代码行,除非是在可导入的模块/类中),它等同于INKEY$函数?此外,我不想导入游戏模块(S),只想要一个INKEY$函数等效(简单,直截了当,小)。
import inkey
a = inkey.inkey()
更新#1:在我安装了readchar模块并更正了Python报告的错误后(stdout.write(a)需要是stdout.write(str(a)),因为变量'a‘似乎是从readchar()函数返回的一个字节字符串),当我使用下面Stratton先生列出的代码时,我只得到b'\xff’的连续流,如果有任何按键,则控制台回显字符。
将其简化为只使用函数也没有什么帮助:
from readchar import readchar
from sys import stdout
import os
#I like clear screens, and I can not lie
os.system('cls') # For Windows
#os.system('clear') # For Linux/OS X
def inkey():
"INKEY$ function"
return readchar()
#let the processing hit the floor, elsewhere
b=0
step = 1
while b < 1000:
b = b + step
print(b)
#convert bytes to integers
a = int.from_bytes(inkey(), "big")
#remember I keep getting b'\xff' (255) when buffer is empty
if chr(a) == "a":
step = step - 1
a = 255 #don't stop
if chr(a) == "l":
step = step + 1
a = 255 #don't stop
if a != 255:
break
它应该从0到999计数b,几乎所有的按键都会停止,'a‘会减少步数,'l’会增加步数。取而代之的是,它根据时间在b值之前或之后打印按键,并持续到b= 1000。我所做的一切都没有改变。
虽然Pauser函数可以替换为input() (i =input(“按Enter键继续”)),但其他两个变体似乎不能那么容易地更改。
发布于 2020-03-29 11:49:17
最接近您所寻找的可能是readchar库。
这里有一个类似于旧的基本逻辑的例子:
from readchar import readchar
from sys import stdout
a = ' '
while ord(a) not in [3,24,27]:
a = readchar()
stdout.write(a)
stdout.flush()
if ord(a) == 13:
stdout.write("\n")
中断循环的数字分别是CTRL-C、CTRL-X和ESC。数字13是回车符;该示例在每个回车符后面写入一个换行符,以避免覆盖文本。
与BASIC中的旧ASC(A$)
等效的是Python语言中的ord(a)
。( CHR$(A$)
是chr(a)
。)
请注意,这将在读取时阻塞。如果没有正在等待的按键,Python将在a = readchar()
行停止,直到按下一个键。要获得BASIC的INKEY$
的完整效果,您需要在读取数据之前验证是否有一些数据正在等待。您可以使用Python的select库来实现这一点。
from readchar import readchar
from sys import stdin, stdout
from select import select
def inkey():
if select([stdin,],[],[],0.0)[0]:
return readchar()
return ''
a = ''
timer = 0
while a != 'Q':
a = inkey()
if a != '':
stdout.write(a)
stdout.flush()
if ord(a) == 13:
stdout.write("\n")
timer += 1
if timer > 1000000:
print("Type faster, human!")
timer = 0
这定义了一个inkey
函数,如果没有等待,则返回空字符串。如果有内容正在读取,则返回readchar()
。每循环1,000,000次,它就会告诉另一端的人打字更快。
在此版本中,它以大写字母“Q”退出,因为这不会阻止CTRL-C、CTRL-X和ESC完全退出程序。
如果你使用Windows,这可能会有麻烦,因为至少有一次select.select
不能在Windows上工作。然而,我没有办法测试这一点。
如果您不需要让pynput看起来与BASIC完全一样,那么您可能还想看看它。在Python中执行此操作的规范方法可能是设置一个调用函数或方法的事件。您的脚本继续执行其操作,如果调用该函数(或方法),它将取消或修改主循环的操作。
https://stackoverflow.com/questions/60896414
复制相似问题