Leer el Código Numérico Completo de cualquier Tecla
Para leer una tecla presionada de forma inmediata, hay que hacer un muestreo en bucle abierto, permanente y activamente sobre el estado del dispositivo de entrada
stdin (
select, timeout=0). Tan pronto como se detecte que hay un carácter en
stdin (
select ⇄ rlist ⇄ stdin) hay que leerlos (
os.read ← sys.stdin.fileno) todos (
while → if → select), hasta detectar que no hay ninguno (
elif → break). Hay que anotar que este código solo funciona en Linux.
- El método fileno() devuelve el descriptor de un archivo (un numero entero), en este caso el descriptor de stdin, para solicitar operaciones de E/S del sistema operativo. En cualquier otro caso generará un error.
- select.select( rlist , wlist , xlist [ , timeout ] )
- select se utiliza para hacer una llamada múltiple de E/S, Con esta llamada podemos saber si un dispositivo E/S esta listo para una lectura o escritura. Aquí hay que diferenciar dos situaciones de este proceso, (1) El Estado Actual de los dispositivos E/S y (2) Estar listos para una lectura o escritura del dispositivo E/S. Sus parámetros son:
- rlist es la lista de dispositivos a los cuales se hace un llamada de entrada. Con esta llamada podemos saber si el dispositivo esta listo para leer lo que contiene su buffer. Si el dispositivo es stdin, indica que hay un carácter en el buffer esperando su lectura.
- wlist es la lista de dispositivos a los cuales se hace un llamada de salida. Con esta llamada podemos saber si el dispositivo esta lista para poder rescribir en ella.
- xlist es la lista de dispositivos que esperan una "condición excepcional"
- timeout es el tiempo de espera. Si timeout > 0.0, esperar timeout hasta obtener el resultado de la llamada, este resultado debe ser (2): ' Estar listos para una lectura o escritura'. Si timeout expira, salir inmediatamente y solo devuelve (1): 'El estado actual'.
- Si timeout = 0.0, salir inmediatamente sin esperar que el resultado de la llamada sea (2), es decir que devuelva inmediatamente lo que encuentre, aquí (1) y (2) son lo mismo.
- keycode almacena el numero de la tecla como '05A42634'h, si la tecla tiene mas de un número, será: keycode = N3 * 2¹⁶ + N2 * 2⁸ + N1.
def GetKeyBoard():
keycode = 0
DefaultConfig = termios.tcgetattr(sys.stdin)
try:
tty.setcbreak(sys.stdin.fileno())
while True:
if select.select([sys.stdin, ], [], [], 0.0)[0]:
#keycode <<= 8
#keycode |= ord(os.read(sys.stdin.fileno(), 1))
keycode = (keycode << 8) | ord(os.read(sys.stdin.fileno(), 1))
elif keycode != 0:
break
finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, DefaultConfig)
return(keycode)
Sumar un Numero Entero de Meses a una Fecha Especifica
Estaba buscando una función que sume una cantidad 'n' de meses a una fecha. Como no quería reinventar la pólvora me puse a buscar un buen código de python por Internet, ¡busqué!... y ¡busqué! pero no lo encontré, o al menos un código que satisfaga mis expectativas: sencillez y rapidez. Bueno tampoco hice una búsqueda muy exhaustiva, seguro que hay buen código desarrollado por ahí, pero ya no quise buscar mas, así que hice mi propia función. Abrí una pagina de Libreoffice Calc y escribí todas las combinaciones resultantes de sumar 'Meses' a una fecha y fui encontrando las ecuaciones para generar estos resultados, una vez que verifique que funcionaban para todos los casos, lo simplifiqué y lo reescribí en código python y bueno aquí esta. Por cualquier caso, todos estos código están con licencia GPL V3.0. (
https://www.gnu.org/licenses/gpl-3.0.en.html)
def AgregarMes(FechaIni, Meses):
NuevoYear = FechaIni.year + int((FechaIni.month + Meses - 1)/12)
NuevoMes = (FechaIni.month + Meses) % 12
return(datetime.date(NuevoYear, NuevoMes if NuevoMes != 0 else 12, FechaIni.day))
Comentarios
Publicar un comentario
Gracias por participar