es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ocultar entrada del usuario no estándar de Python

Estoy creando un juego de consola que captura las pulsaciones de teclas del usuario.

Tuve problemas para ocultar las letras que luego se dispersan por la pantalla simplemente porque el usuario está presionando un botón.

No funcionará con módulos como getpass, y ya he probado varios códigos ANSI para intentar ocultar el texto. El fondo también está lleno de caracteres y símbolos de texto, por lo que eso impide que simplemente desaparezca un carácter ANSI completo. También quiero evitar tener que llamar os.system("clear") en cada fotograma, porque incluso llamarlo una vez cada segundo genera errores en la terminal.

Lo que quiero saber es si hay alguna manera de capturar las pulsaciones de teclas sin que dicha tecla aparezca en la consola.

Aquí está la clase board que estoy usando, y el método draw() dentro es cómo he estado dibujándolo en la terminal:

class board:
  def __init__(self, length):
    import random
    self.random = random
    self.characters = [" ", "░", "▒", "▓", "█"]
    self.length = length
    self.dithering = False
    self.board = [[self.random.choice(self.characters) for y in range(self.length)] for x in range(self.length)]
  def draw(self, colour=None):
    if colour == None:
      colour = RGB(0, 1, 0)
    for x in range(len(self.board)):
      for y in range(len(self.board)):
        if self.board[y][x] == None:
          continue
        f = 1
        if self.dithering == True:
          f = self.random.random() + 0.5 # faintness
        print(f"\u001b[{y};{x*2+1}H\x1b[38;2;{int(colour.r*f)};{int(colour.g*f)};{int(colour.b*f)}m{str(self.board[y][x])*2}", end="")
    print("\x1b[0m")
  def redecorate(self, characters=None):
    if characters == None:
      characters = self.characters
    self.board = [[self.random.choice(characters) for y in range(self.length)] for x in range(self.length)]
  def empty(self):
    self.board = [[None for y in range(self.length)] for x in range(self.length)]

class RGB:
  def __init__(self, r, g, b):
    self.r = r*255
    self.g = g*255
    self.b = b*255
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para capturar las pulsaciones de teclas del usuario sin que la tecla aparezca en la consola, puedes intentar utilizar la función getch() del módulo curses. Esta función está especialmente diseñada para capturar pulsaciones de teclas sin imprimirlas en la consola.

    Aquí tienes un ejemplo de implementación:

    import curses
    
    ...
    
    def jugar_juego():
      pantalla = curses.initscr()
      curses.cbreak()
      pantalla.keypad(True)
    
      while True:
        tecla = pantalla.getch()
        if tecla == ord('q'):
          break
        # procesar la entrada de tecla y actualizar el estado del juego
        ...
    
      curses.endwin()
    

    En este ejemplo, curses.initscr() inicializa la pantalla para utilizarla con curses, curses.cbreak() desactiva el almacenamiento en búfer de línea para que las teclas se procesen a medida que se pulsan, y pantalla.keypad(True) habilita el reconocimiento de teclas especiales como las teclas de flecha.

    El bucle while llama continuamente a pantalla.getch() para esperar a que el usuario pulse una tecla. Si la tecla pulsada es la letra ‘q’, el juego se detiene al salir del bucle. En caso contrario, se procesa la entrada de tecla y se actualiza el estado del juego en consecuencia.

    Una vez que el juego haya terminado de ejecutarse, se llama a curses.endwin() para restaurar la consola a su estado original.

    Utilizar curses.getch() debería permitirte capturar pulsaciones de teclas sin imprimirlas en la consola ni interferir con la salida actual de la consola.

Comments are closed.