teclado - print python 3.6 5
Cómo establecer una cadena predeterminada para raw_input? (6)
Estoy usando raw_input de raw_input
para leer de stdin.
Quiero permitir que el usuario cambie una cadena predeterminada determinada.
Código:
i = raw_input("Please enter name:")
Consola:
Please enter name: Jack
Al usuario se le debe presentar Jack
pero puede cambiarlo (retroceder) a otra cosa.
El argumento Please enter name:
sería el mensaje de entrada raw_input
y esa parte no debería ser cambiable por el usuario.
En la respuesta del dheerosaur Si el usuario presiona Enter para seleccionar el valor predeterminado en realidad, no se guardará ya que Python lo considera como '''' string así que se extiende un poco sobre lo que dheerosaur.
default = "Jack"
user_input = raw_input("Please enter name: %s"%default + chr(8)*4)
if not user_input:
user_input = default
Fyi .. El ASCII value
de retroceso es 08
En plataformas con readline
, puede usar el método que se describe aquí: https://.com/a/2533142/1090657
En Windows, puede usar el módulo msvcrt:
from msvcrt import getch, putch
def putstr(str):
for c in str:
putch(c)
def input(prompt, default=None):
putstr(prompt)
if default is None:
data = []
else:
data = list(default)
putstr(data)
while True:
c = getch()
if c in ''/r/n'':
break
elif c == ''/003'': # Ctrl-C
putstr(''/r/n'')
raise KeyboardInterrupt
elif c == ''/b'': # Backspace
if data:
putstr(''/b /b'') # Backspace and wipe the character cell
data.pop()
elif c in ''/0/xe0'': # Special keys
getch()
else:
putch(c)
data.append(c)
putstr(''/r/n'')
return ''''.join(data)
Tenga en cuenta que las teclas de flechas no funcionan para la versión de Windows, cuando se utiliza, no pasará nada.
Podrías hacerlo:
i = raw_input("Please enter name[Jack]:") or "Jack"
De esta forma, si el usuario simplemente presiona regresar sin ingresar nada, a "i" se le asignará "Jack".
Pruebe esto: raw_input("Please enter name: Jack" + chr(8)*4)
El valor ASCII de backspace
es 08
.
Solo agrego esto porque debes escribir una función simple para reutilizar. Aquí está el que escribí:
def default_input( message, defaultVal ):
if defaultVal:
return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
else:
return raw_input( "%s " % (message) )
Python2.7 obtiene raw_input y establece un valor predeterminado:
Pon esto en un archivo llamado a.py:
import readline
def rlinput(prompt, prefill=''''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(prompt)
finally:
readline.set_startup_hook()
default_value = "an insecticide"
stuff = rlinput("Caffeine is: ", default_value)
print("final answer: " + stuff)
Ejecute el programa, se detiene y presenta al usuario con esto:
el@defiant ~ $ python2.7 a.py
Caffeine is: an insecticide
El cursor está al final, el usuario presiona la tecla de retroceso hasta que ''un insecticida'' se haya ido, escriba algo más, luego presiona enter:
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
El programa termina así, la respuesta final obtiene lo que el usuario escribió:
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
final answer: water soluable
Equivalente a la anterior, pero funciona en Python3:
import readline
def rlinput(prompt, prefill=''''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return input(prompt)
finally:
readline.set_startup_hook()
default_value = "an insecticide"
stuff = rlinput("Caffeine is: ", default_value)
print("final answer: " + stuff)
Más información sobre lo que está pasando aquí:
https://.com/a/2533142/445131