私はPython 2.7のraw_input
を使用してstdinから読み取ります。
ユーザーに特定のデフォルト文字列を変更させたい。
コード:
i = raw_input("Please enter name:")
コンソール:
Please enter name: Jack
ユーザーにはJack
が表示されるはずですが、それを別のものに変更(バックスペース)できます。
Please enter name:
引数はraw_input
のプロンプトになり、その部分はユーザーが変更できないようにする必要があります。
できること:
i = raw_input("Please enter name[Jack]:") or "Jack"
このようにして、ユーザーが何も入力せずにReturnキーを押すと、「i」に「Jack」が割り当てられます。
Python2.7はraw_inputを取得してデフォルト値を設定します:
これを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)
プログラムを実行すると、停止し、ユーザーに次のように表示されます。
el@defiant ~ $ python2.7 a.py
Caffeine is: an insecticide
カーソルは最後にあり、ユーザーは「殺虫剤」がなくなるまでバックスペースを押し、他の何かを入力してからEnterを押します。
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
プログラムはこのように終了し、最終的な答えはユーザーが入力したものを取得します。
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
final answer: water soluable
上記と同等ですが、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)
ここで何が起こっているかの詳細:
Dheerosaurの答えでは、ユーザーがEnterを押して実際にデフォルト値を選択すると、pythonは ''文字列と見なされるため、dheerosaurを少し拡張します。
default = "Jack"
user_input = raw_input("Please enter name: %s"%default + chr(8)*4)
if not user_input:
user_input = default
Fyi .. ASCII value
バックスペースの08
再利用のために単純な関数を作成する必要があるため、これを追加するだけです。これが私が書いたものです:
def default_input( message, defaultVal ):
if defaultVal:
return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
else:
return raw_input( "%s " % (message) )
readline
を備えたプラットフォームでは、次の方法を使用できます。 https://stackoverflow.com/a/2533142/1090657
Windowsでは、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)
矢印キーはWindowsバージョンでは機能しないため、使用しても何も起こらないことに注意してください。