Python(最好是3)相当于INKEY$

2024-09-27 07:19:26 发布

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

我在Windows7系统上使用Python3.6.4(我有Win10和Android等其他系统,但这是我的起点)

INKEY$,对于那些不熟悉BASIC(几乎任何风格)的人来说,是一个检查键盘缓冲区的函数,如果没有数据,它将以字符串或空/空值(“”)的形式返回数据,并清除缓冲区。返回字符串的长度取决于缓冲区中的数据,通常在一次击键时为0、1或2(在过去,快速打字员可以在两次检查之间填充小缓冲区)。不需要输入键(除非您正在寻找输入键),也不处理输入键,并且程序不会暂停,除非已编程完成此操作

暂停者:

    a$=""
    while a$=""
    a$=inkey$
    wend

流量断续器:

    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$函数等效?另外,我不想导入游戏模块,只想要一个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,在几乎任何一个按键上停止,“a”会减少步长,“l”会增加步长。相反,它会根据时间在b值之前或之后打印按键,并持续到b=1000。我所做的一切都没有改变

虽然Pauser函数可以替换为input()(i=input(“按Enter键继续”)),但其他两个变量似乎无法如此轻松地更改


Tags: 模块数据函数字符串importinputifstep
1条回答
网友
1楼 · 发布于 2024-09-27 07:19:26

最接近您要查找的可能是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()。循环中每1000000次,它就会告诉另一端的人打字更快

在这个版本中,它以大写字母“Q”退出,因为这不会阻止CTRL-C、CTRL-X和ESC完全脱离程序

如果您正在使用Windows,这可能会有问题,因为select.select至少有一次在Windows上不起作用。然而,我没有办法测试这一点

如果您不需要它看起来完全像BASIC,那么您可能还需要查看pynput。在Python中实现这一点的规范方法可能是设置一个调用函数或方法的事件。脚本继续执行它的操作,如果调用了该函数(或方法),它将取消或修改主循环的操作

相关问题 更多 >

    热门问题