Python (предпочтительно 3) эквивалентно INKEY $ - PullRequest
0 голосов
/ 28 марта 2020

Я использую Python 3.6.4 в системе Windows 7 (у меня есть другие системы, такие как Win 10 и Android, но это моя отправная точка).

INKEY $, для тех не знакомый с BASI C (почти любой вариант), это функция, которая проверяет буфер клавиатуры, возвращая эти данные в виде строки или нулевого / пустого значения (""), если данных не было, и очищает буфер. Длина возвращаемой строки зависит от данных в буфере, обычно 0, 1 или 2 за одно нажатие клавиши (быстрая машинистка могла заполнить небольшой буфер между проверками в старые времена). Клавиша Enter не нужна (если это не то, что вы искали) или обрабатывается, и программа не приостанавливается, если не запрограммирована на это.

Пауза:

    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 простую кроссплатформенную функцию (ie не более 10 строк кода, если только не импортируется) модуль / класс), что эквивалентно функции INKEY $? Кроме того, я не хочу импортировать игровой модуль (-и), просто хочу эквивалент функции $ INKEY (простой, прямой, маленький).

    import inkey
    a = inkey.inkey()

Обновление № 1: после того, как я установил модуль readchar и исправил сообщенную ошибку с помощью Python (stdout.write (a) должен быть stdout.write (str (a)), так как переменная 'a' кажется возвращаемой в виде байтовой строки из функции readchar ()) при использовании код, указанный г-ном Страттоном ниже, я получаю только непрерывный поток символов 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 

Предполагается, что b будет отсчитываться от 0 до 999, останавливаясь практически при любом нажатии клавиши, «a» уменьшает шаг, «l» увеличивает его. Вместо этого он печатает нажатие клавиши до или после значения b в зависимости от времени и продолжается до b = 1000. Ничего из того, что я сделал, не изменило.

Хотя функцию Паузера можно заменить на вход () ( i = input («Нажмите Enter, чтобы продолжить»)) два других варианта изменить нельзя так просто, как кажется.

1 Ответ

0 голосов
/ 29 марта 2020

Наиболее близким к тому, что вы ищете, является, вероятно, библиотека readchar .

Вот пример, похожий на старый BASI C logi c:

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")

Те цифры, которые разбивают l oop, - это CTRL- C, CTRL-X и ES C соответственно. Номер 13 - возврат каретки; пример записывает перевод строки после каждого возврата каретки, чтобы избежать перезаписи текста.

Эквивалент старому ASC(A$) в BASI C равен ord(a) в Python. (И CHR$(A$) равно chr(a).)

Обратите внимание, что это будет блокировать чтение. Если нажатие не ожидается, Python остановится на линии a = readchar(), пока не будет нажата клавиша. Чтобы получить полный эффект INKEY$ от BASIC, вам нужно проверить, что некоторые данные ожидают, прежде чем их прочитать. Вы можете сделать это с помощью библиотеки select в Python.

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 раз через l oop он говорит человеку на другом конце печатать быстрее.

В этой версии он завершается с заглавной буквы «Q», так как это не блокирует CTRL- C, CTRL-X и ES C от выхода из программы вообще.

Это может вызвать проблемы, если вы используете Windows, так как select.select по крайней мере в одно время не работа на Windows. Однако у меня нет возможности проверить это.

Вы также можете посмотреть pynput , если вам не нужно, чтобы он выглядел точно так же, как BASI C. Канонический способ сделать это в Python, вероятно, состоит в том, чтобы установить событие, которое вызывает функцию или метод. Ваш скрипт продолжает делать свое дело, и если эта функция (или метод) вызывается, он отменяет или изменяет действие основного l oop.

...