首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python (最好是3)等同于INKEY$

Python (最好是3)等同于INKEY$
EN

Stack Overflow用户
提问于 2020-03-28 09:58:24
回答 1查看 794关注 0票数 0

我在Windows7系统上使用Python 3.6.4 (我还有Win 10和Android等其他系统,但这是我的起点)。

对于那些不熟悉BASIC (几乎任何风格)的人来说,INKEY$是一个检查键盘缓冲区的函数,如果没有数据,则以字符串或null/空值("")的形式返回数据,并清除缓冲区。返回字符串的长度取决于缓冲区中的数据,通常是0、1或2,只需一次击键(在过去,速度快的打字员可以在两次检查之间填充较小的缓冲区)。Enter键是不需要的(除非这就是您要找的),也不会被处理,程序不会暂停,除非编程这样做。

Pauser:

代码语言:javascript
运行
复制
    a$=""
    while a$=""
    a$=inkey$
    wend

Flow Interrupter:

代码语言:javascript
运行
复制
    a=0
    while a < 1000
        a=a+1
        print a
        a$=inkey$
        if a$<>"" then exit while
    wend

快速解析器:

代码语言:javascript
运行
复制
    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$函数等效(简单,直截了当,小)。

代码语言:javascript
运行
复制
    import inkey
    a = inkey.inkey()

更新#1:在我安装了readchar模块并更正了Python报告的错误后(stdout.write(a)需要是stdout.write(str(a)),因为变量'a‘似乎是从readchar()函数返回的一个字节字符串),当我使用下面Stratton先生列出的代码时,我只得到b'\xff’的连续流,如果有任何按键,则控制台回显字符。

将其简化为只使用函数也没有什么帮助:

代码语言:javascript
运行
复制
    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键继续”)),但其他两个变体似乎不能那么容易地更改。

EN

回答 1

Stack Overflow用户

发布于 2020-03-29 11:49:17

最接近您所寻找的可能是readchar库。

这里有一个类似于旧的基本逻辑的例子:

代码语言:javascript
运行
复制
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库来实现这一点。

代码语言:javascript
运行
复制
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中执行此操作的规范方法可能是设置一个调用函数或方法的事件。您的脚本继续执行其操作,如果调用该函数(或方法),它将取消或修改主循环的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60896414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档