Как установить редактируемую строку по умолчанию для raw_input? - PullRequest
45 голосов
/ 23 марта 2011

Я использую Python 2.7 raw_input для чтения из стандартного ввода.

Я хочу позволить пользователю изменить заданную строку по умолчанию.

Код:

i = raw_input("Please enter name:")

Консоль:

Please enter name: Jack

Пользователь должен быть представлен с Jack, но может изменить его (возврат) на другое значение.

Аргумент Please enter name: будет подсказкойдля raw_input, и эта часть не должна изменяться пользователем.

Ответы [ 6 ]

80 голосов
/ 03 декабря 2013

Вы можете сделать:

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

Таким образом, если пользователь просто нажимает кнопку возврата, не вводя ничего, «i» будет назначен «Джек».

12 голосов
/ 13 апреля 2016

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

Курсор находится в конце, пользователь нажимает клавишу возврата, пока «инсектицид» не исчезнет, ​​что-то вводит, затем нажимает ввод:

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)

Подробнее о том, что здесь происходит:

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

7 голосов
/ 23 марта 2011

В ответе дирозавра. Если пользователь нажмет Enter, чтобы выбрать значение по умолчанию, оно не будет сохранено, так как python рассматривает его как строку '', поэтому немного расширяется в отношении того, что дразилов.1004 * возврата составляет 08

4 голосов
/ 09 сентября 2014

Я добавляю это только потому, что вы должны написать простую функцию для повторного использования. Вот тот, который я написал:

def default_input( message, defaultVal ):
    if defaultVal:
        return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
    else:
        return raw_input( "%s " % (message) )
4 голосов
/ 23 июля 2012

На платформах с 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, когда она используется, ничего не произойдет.

0 голосов
/ 23 марта 2011

Попробуйте: raw_input("Please enter name: Jack" + chr(8)*4)

Значение ASCII backspace равно 08.

...