¿Como capturar teclado o combinacion de teclas en python3?

publicado por: Anonymous

Hola quisiera saber como puedo capturar combinaciones de teclas en , por ejemplo al presionar Ctrl+A ejecute un método en una clase. Es para un programa en consola y esto es lo que he encontrado hasta ahora de información.

#! /usr/bin/env python3
import rlcompleter
import readline

readline.parse_and_bind("tab: complete")
grupo_a = set([1, 2, 3])

cmd = None

while cmd not in ['quit', 'exit']:
    cmd = input('>> ')
    exec(cmd)

solución

Hay muchas formas de abordar esto y depende de lo que quieras hacer al final. Agregando otras posibilidades a lo ya expuesto por Patricio en su respuesta:

En Linux puedes usar curses de la biblioteca estándar para crear aplicaciones en terminal mejoradas usando ncurses. Facilita la presentación de las salidas/entradas (mediante tabulacion), colores, bordes de ventana, permite responder a eventos de teclado (como combinaciones de teclas), etc. Un ejemplo algo simple usando combinaciones de teclas (Alt+P, Alt+A, Alt+E) para llamar a funciones (nada optimizado):

#!/usr/bin/env python

import curses

def get_param(screen, prompt_string):
     curses.echo()
     screen.clear()
     screen.addstr(2, 2, prompt_string)
     screen.refresh()
     input = screen.getstr(2, len(prompt_string)+2, 60)
     return input

def sumar(screen):
    curses.noecho()
    n = int(get_param(screen, 'Ingrese un número: '))
    m = int(get_param(screen, 'Ingrese otro número: '))
    screen.addstr(2, 2, 'La suma de {} y {} es {}.'.format(n, m, n + m))
    screen.addstr(4, 2, 'Pulse Enter para volver al menú')
    while True:
        ch = screen.getch()
        if ch == 10: #Enter
            main(screen)
            break

def restar(screen):
    curses.echo()
    n = int(get_param(screen, 'Ingrese un número: '))
    m = int(get_param(screen, 'Ingrese otro número: '))
    screen.addstr(2, 2, 'La resta de {} y {} es {}.'.format(n, m, n - m))
    screen.addstr(4, 2, 'Pulse Enter para volver al menú')
    while True:
        ch = screen.getch()
        if ch == 10: #Enter
            main(screen)
            break


def main(screen):
    curses.echo()
    while True:
        screen.clear()
        screen.border(0)
        screen.addstr(2, 2, "Alt+A para sumar dos numeros")
        screen.addstr(3, 2, "Alt+P para restar dos numeros")
        screen.addstr(4, 2, "Alt+E para salir de la app")
        ch = screen.getch(5, 2)

        if ch == 27: #Tecla Alt
            screen.nodelay(True)
            ch2 = screen.getch() # obtener tecla pulsada despues de Alt
            if ch2 == -1 or ch2 == ord('e') or ch2 == ord('E'):
                break
            elif ch2 == ord('a') or ch2 == ord('A'):
                screen.nodelay(False)
                sumar(screen)
                break
            elif ch2 == ord('p') or ch2 == ord('P'):
                screen.nodelay(False)
                restar(screen)
                break
            else:
                screen.refresh()
            screen.nodelay(False)


curses.wrapper(main)

Otra opción puede ser usar una de las tantas librerías que hay para capturar/controlar acciones de teclado/ratón. Son tipicamente usadas para implementar keyloggers pero pueden tener fines más ‘correctos’. Entre ellos tenemos pyxhook o Pynput.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *