Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: El mas antiguo en 24 Enero 2022, 21:00 pm



Título: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 24 Enero 2022, 21:00 pm
Hola gente ¿Cómo están?, les dejo este para que me digan como presionar(virtualmente) la tecla “backspace” cuando se detecta un ingreso que no sea un número.-
Encontré algunas maneras pero lo único que logro es ralentizar el programa y que  no pueda ingresar nada mas.-


Código
  1. from pynput import keyboard as kb
  2. #import keyboard
  3.  
  4. def pulsa(tecla):
  5.    tmpTecla = str(tecla)
  6.    if '<' not in tmpTecla and tmpTecla != 'Key.esc' and tmpTecla != "Key.backspace":
  7.        print('No es un numero')
  8.  
  9.  
  10. def suelta(tecla):
  11.    if tecla == kb.Key.esc:
  12.        return False
  13.  
  14. escuchador = kb.Listener(pulsa, suelta)
  15. escuchador.start()
  16.  
  17. print('\n Solo números(con [escape] finaliza...: ', end="")
  18. while escuchador.is_alive():
  19.    pass
  20.  

Edito: esto que pongo a continuación funciona perfectamente solo pero no logro aplicarlo al código anterior.-

Código
  1. import keyboard
  2.  
  3. keyboard.press("windows+d")
  4. keyboard.release("windows+d")
  5.  


Desde ya gracias y un saludo a todos.


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: fary en 24 Enero 2022, 22:02 pm
¿No es mas fácil informar al usuario de que no se permiten números? Luego simplemente haces una comprobación y listo.



Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 24 Enero 2022, 22:44 pm
Hola fary, si eso ya lo aprendí, lo que necesito es profundizar en algunas cosas antes de encarar la parte grafica.-

Código
  1. try:
  2.    numero = int(input(" Ingrese un numero entero (máximo 5 números)...: "))
  3. except ValueError:
  4.    print("\n Lo que ingreso no es un numero entero...")
  5. else:
  6.    contador = len(str(numero))    
  7.    if contador < 6:
  8.        print("\n El numero ingresado es valido = ", numero)
  9.    else:
  10.        print('\n El número ingresado es valido pero tiene mas de 5 cifras...')


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: fary en 24 Enero 2022, 23:33 pm
No sé si existirá lo que buscas  :huh: Por lo menos hasta donde yo sé, o yo no lo conozco en otros lenguajes de programación.

Realmente pulsar la tecla de retroceso no es una solución buena.

A ver que opinan otros compañeros.


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: Tachikomaia en 25 Enero 2022, 00:44 am
Luego de que se capte una presión de tecla, ver si es número, y en caso de que no lo sea borrar el último caracter del string. ¿Te sirve?


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 25 Enero 2022, 00:56 am
Hola, no solo que me sirve es exactamente lo que estoy buscando, adelante.-
Ahora que viene, pedirme el CBU, jajajajaja, adelante


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 25 Enero 2022, 02:31 am
Bueno no van a creer que ya lo logre, tengo una inmensa alegría  ;D ;D ;D, me falta ajustar una
cosa que no hace al funcionamiento sino a lo visual, después que el amigo postee su código, posteo el mío.-
Nos leemos mañana(Argentina)   


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 25 Enero 2022, 20:10 pm
Hola gente ¿Cómo están? Bueno presento mi código en sociedad, me falta tan solo unas líneas para que acepte también números reales.-

Código
  1. import keyboard
  2.  
  3. numero = ""
  4. print('\n solo números...: ', end="")
  5. while True:
  6.    if keyboard.read_key() == "enter":
  7.        break
  8.    else:
  9.        tecla = keyboard.read_key()
  10.        if tecla == "backspace":
  11.            numero = numero[:-1]
  12.        else:
  13.            if not tecla.isdigit():
  14.                keyboard.send("backspace")
  15.            else:
  16.                numero += tecla
  17.  
  18. numeros = int(numero)
  19. print('\n final', numeros)
  20.  

Slds.



Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: Tachikomaia en 26 Enero 2022, 13:34 pm
¿Qué pasa si en el cuadro de texto pegan letras?


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 26 Enero 2022, 15:29 pm
Hola buen día para todo.-
Que pasa amigo, yo esperaba de Ud. Un ej. de código y me sale con un problema, esta muy bien gracias x hacérmelo notar, ya veremos.-
Por el momento dejo el código con un pequeño avance, no había contemplado el hecho de que el operario presionara la tecla “backspace”.-
Lo que me pasa ahora es que si el operario pulsa “flecha izquierda” o “flecha derecha” no funciona, hacer que no haga nada es muy fácil(además es como debe ser)
lo que es mas difícil es si se mueve con la flecha y luego aprieta “Sup” ¿Cómo posicionarme en la variable número? Para borrar el número correspondiente, ya lo voy a lograr.- 


Código
  1. import keyboard
  2.  
  3. numero = ""
  4. print('\n solo números...: ', end="")
  5.  
  6. while True:
  7.    if keyboard.read_key() == "enter":
  8.        break
  9.    else:
  10.        tecla = keyboard.read_key()
  11.        if tecla == "backspace":
  12.            numero = numero[:-1]
  13.        else:
  14.            if not tecla.isdigit():
  15.                keyboard.send("backspace")
  16.            else:
  17.                numero += tecla
  18.  
  19. numeros = int(numero)
  20. print('\n final', numeros)
  21.  

Si alguien me quiere ayudar Danielito agradecido  ;D ;D ;D

Slds.


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: Tachikomaia en 26 Enero 2022, 22:39 pm
Yo no te puedo ayudar mucho porque no sé mucho sobre tareas normales y además no uso tu lenguaje de programación.


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 27 Enero 2022, 13:53 pm
Hola buen día para todos.-
Bueno lo estoy probando y parece que no hay errores, en cuanto a lo que propone Tachikomaia la verdad que no se ni por donde empezar pero seguramente lo voy a lograr, veremos como hacerlo.-
A el/los modeladores les pido que me digan si estoy haciendo muy extenso el hilo y de ser así paramos.-

Código
  1. import keyboard
  2.  
  3. numero = []
  4. cursor = 0
  5. final  = 0
  6. print('\n solo números...: ', end="")
  7.  
  8. while True:
  9.    if keyboard.read_key() == "enter":
  10.        break
  11.  
  12.    tecla = keyboard.read_key()
  13.    if tecla == "supr":
  14.        numero.pop(cursor)  
  15.    elif tecla == "backspace":
  16.        numero.pop()
  17.    elif not tecla.isdigit() and tecla != "flecha izquierda" and tecla != "flecha derecha":
  18.        keyboard.send("backspace")
  19.    elif tecla == "flecha izquierda":
  20.        if cursor >=1:
  21.            cursor -= 1
  22.    elif tecla == "flecha derecha":
  23.        if cursor < final:        
  24.            cursor += 1
  25.    else:
  26.        numero.insert(cursor, tecla)
  27.        final = len(numero) -1
  28.        cursor += 1
  29.  
  30. tmpNumero = ""
  31. if len(numero) > 0:
  32.    indice = 0
  33.    for num in numero:
  34.        tmpNumero += numero[indice]
  35.        indice += 1
  36.  
  37. numFinal = int(tmpNumero)
  38. print(numFinal)
  39.  
Slds.


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: Sokoleonardo en 28 Enero 2022, 19:40 pm
Hola!

en el antiguo python no tenias que importarla, es la funcion getch(); que devuelve la pulsación en bytes, ahora tenes que importarla en python 3:
Código:
from msvcrt import getch

Esta función lamentablemente esta funcionando solo en modo consola y no corriendo en el IDLE.

Yo, antiguamente habia logrado lo que estas pidiendo pero en C, porque esta funcion tambien esta en C facilmente.

Código:
from msvcrt import getch

letra = getch();

if letra == b"\n":
    print("Pulsaste enter.");
elif ord(letra) == 8:
    print("Pulsaste retroceso");

Lógicamente deberías crear una función con bucle donde cada letras se sume a la cadena que estas creando después de que esa letra fue "validada", también de lo contario si es "\n" termina el bucle y la función devuelve el resultado... Si quieres borrar lo que el usuario esta escribiendo podrías ayudarte de imprimir \r (retorno de carro) que retrocede al comienzo de la línea actual.

Código:
print(end="\r"); #retrocede

Eso es todo por ahora, tendrás que meterle mano, preguntas cualquier cosa.








Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: El mas antiguo en 29 Enero 2022, 15:36 pm
Hola, muy buen día para todos.-
leonardo, te comento que getch no me da error pero me es imposible hacer que se muestre algún resultado, una consulta ¿en que me beneficiaria reemplazar keyboard por getch?.-

Slds.


Título: Re: Presionar tecla de forma virtual (no física)
Publicado por: Tachikomaia en 30 Enero 2022, 00:47 am
Tal vez te sirva algo así:
Código:
N = 0
Do
   si characternro N != "0"
      eliminar todo el texto   
      N = últimochar
   sino si characternro N != "1"
      etc, etc
while N<=último char

Puedes usar 2 while para evitar escribir tantos ifs, es q7ue yo no me doty mucha maña.

Por otro lado, no sé cómo se toman los números si son pegados en el cuadro de texto ¿números o texto? Pero debería haber una función para saber si son números o texto...