Сделать так, чтобы текст отображался сразу при нажатии клавиши

#python #text #enter

#python #текст #введите

Вопрос:

Я создаю текстовую игру, и я хочу, чтобы пользователь мог нажимать enter, пока текст отображается по буквам, чтобы оставшаяся часть текста отображалась немедленно.

Пока это мой код

 import time 
import sys 

def print(s): 
    for c in s:
        sys.stdout.write(c)
        sys.stdout.flush()
        time.sleep(0.01)
        
def sceneOne():
  print ("insertn"
  "textn"
  "heren")

  
  input("n[Press enter to continue]n")

  print ("insertn"
  "textn"
  "heren")

  input("n[Press enter to continue]n")

sceneOne()

 

Я хочу, чтобы текст «Нажмите enter, чтобы продолжить» находился под текстом «вставить текст здесь», пока текст отображается по буквам, чтобы пользователь мог ускорить отображение текста, если он уже играл в игру и хочет ускорить прохождение этой части, чтобы быстрее перейти к следующему выбору.

Комментарии:

1. Я чувствую, что это будет сложно выполнить с помощью метода input(), поскольку он предназначен для простых «модальных» (прерывающих поток программы) задач ввода. Возможно, эта keyboard библиотека будет работать лучше pypi.org/project/keyboard

2. используя обычный print() , и input() вы не можете контролировать, где вы отображаете текст — вы не можете перейти к предыдущей строке для отображения текста. На некоторых консолях / терминалах вы можете использовать специальные коды print() для перемещения курсора в любом месте. И это используется такими модулями, как curses , urwind . Кроме input() того, блокирует код, и ваш print() код также блокирует код, и они должны выполняться в отдельных потоках. возможно curses , есть способ проверить, есть ли новый символ во вводе без блокирующего кода — или искать getchar or getch в Python

Ответ №1:

установите модуль клавиатуры, а затем вы можете создать прослушиватель событий. Затем измените функцию печати, чтобы она не переходила в режим ожидания, если они нажмут enter. Смотрите ниже:

 def print(s): 
    for c in s:
        if keyboard.is_pressed('enter'):
            sys.stdout.write(c)
            sys.stdout.flush()
        else:
            sys.stdout.write(c)
            sys.stdout.flush()
            time.sleep(0.05)