J'utilise Python 2.7's raw_input
pour lire depuis stdin.
Je veux laisser l'utilisateur changer une chaîne par défaut donnée.
Code:
i = raw_input("Please enter name:")
Console:
Please enter name: Jack
L'utilisateur doit être présenté avec Jack
mais peut le changer (retour arrière) en quelque chose d'autre.
Le Please enter name:
l'argument serait l'invite pour raw_input
et cette partie ne doit pas être modifiable par l'utilisateur.
Vous pourriez faire:
i = raw_input("Please enter name[Jack]:") or "Jack"
De cette façon, si l'utilisateur appuie simplement sur Entrée sans rien saisir, "i" se verra attribuer "Jack".
Python2.7 obtient raw_input et définit une valeur par défaut:
Mettez ceci dans un fichier appelé 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)
Exécutez le programme, il s'arrête et présente à l'utilisateur ceci:
el@defiant ~ $ python2.7 a.py
Caffeine is: an insecticide
Le curseur est à la fin, l'utilisateur appuie sur retour arrière jusqu'à ce qu'il n'y ait plus "d'insecticide", tape autre chose, puis appuie sur Entrée:
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
Le programme se termine comme ceci, la réponse finale obtient ce que l'utilisateur a tapé:
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
final answer: water soluable
Équivalent à ci-dessus, mais fonctionne 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)
Plus d'informations sur ce qui se passe ici:
Dans la réponse de Dheerosaur Si l'utilisateur appuie sur Entrée pour sélectionner la valeur par défaut, il ne sera pas enregistré en tant que python le considère comme une chaîne '', ce qui étend un peu ce Dheerosaur.
default = "Jack"
user_input = raw_input("Please enter name: %s"%default + chr(8)*4)
if not user_input:
user_input = default
Pour info .. Le ASCII value
du retour arrière est 08
J'ajoute cela uniquement parce que vous devez écrire une fonction simple à réutiliser. Voici celui que j'ai écrit:
def default_input( message, defaultVal ):
if defaultVal:
return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
else:
return raw_input( "%s " % (message) )
Sur les plateformes avec readline
, vous pouvez utiliser la méthode décrite ici: https://stackoverflow.com/a/2533142/1090657
Sous Windows, vous pouvez utiliser le module 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)
Notez que les touches fléchées ne fonctionnent pas pour la version Windows, quand elle est utilisée, rien ne se passera.