web-dev-qa-db-ja.com

raw_inputのデフォルトの編集可能な文字列を設定する方法は?

私はPython 2.7のraw_inputを使用してstdinから読み取ります。

ユーザーに特定のデフォルト文字列を変更させたい。

コード:

i = raw_input("Please enter name:")

コンソール:

Please enter name: Jack

ユーザーにはJackが表示されるはずですが、それを別のものに変更(バックスペース)できます。

Please enter name:引数はraw_inputのプロンプトになり、その部分はユーザーが変更できないようにする必要があります。

46
ifschleife

できること:

i = raw_input("Please enter name[Jack]:") or "Jack"

このようにして、ユーザーが何も入力せずにReturnキーを押すと、「i」に「Jack」が割り当てられます。

79
codefreak

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)

プログラムを実行すると、停止し、ユーザーに次のように表示されます。

[email protected] ~ $ python2.7 a.py
Caffeine is: an insecticide

カーソルは最後にあり、ユーザーは「殺虫剤」がなくなるまでバックスペースを押し、他の何かを入力してからEnterを押します。

[email protected] ~ $ python2.7 a.py
Caffeine is: water soluable

プログラムはこのように終了し、最終的な答えはユーザーが入力したものを取得します。

[email protected] ~ $ 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)

ここで何が起こっているかの詳細:

https://stackoverflow.com/a/2533142/445131

13
Eric Leschinski

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

7
Anuj

再利用のために単純な関数を作成する必要があるため、これを追加するだけです。これが私が書いたものです:

def default_input( message, defaultVal ):
    if defaultVal:
        return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
    else:
        return raw_input( "%s " % (message) )
4
chubbsondubs

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バージョンでは機能しないため、使用しても何も起こらないことに注意してください。

4
quantum