Показать значение по умолчанию для редактирования на входе Python возможно?
Возможно ли, чтобы python принимал ввод следующим образом:
Folder name: Download
Но вместо того, чтобы пользователь набрал "Загрузить", он уже существует как начальное значение. Если пользователь хочет отредактировать его как "Загрузки", все, что ему нужно сделать, это добавить 's' и нажать enter.
Использование обычной команды ввода:
folder=input('Folder name: ')
все, что я могу получить, это пустое приглашение:
Folder name:
Есть ли простой способ сделать это, что мне не хватает?
Ответы
Ответ 1
Стандартные функции библиотеки input()
и raw_input()
не имеют этой функции. Если вы используете Linux, вы можете использовать модуль readline
для определения функции ввода, которая использует значение предварительной заливки и расширенное редактирование строк:
def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(prompt)
finally:
readline.set_startup_hook()
Ответ 2
Я предполагаю, что вы имеете в виду из командной строки. Я никогда не видел начальных значений для командной строки, они обычно имеют форму:
Folder [default] :
который в коде просто:
res = raw_input('Folder [default] : ')
res = res or 'default'
В качестве альтернативы вы можете попробовать что-то сделать, используя модуль curses в Python.
Ответ 3
Это работает в окнах.
import win32console
_stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)
def input_def(prompt, default=''):
keys = []
for c in unicode(default):
evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
evt.Char = c
evt.RepeatCount = 1
evt.KeyDown = True
keys.append(evt)
_stdin.WriteConsoleInput(keys)
return raw_input(prompt)
if __name__ == '__main__':
name = input_def('Folder name: ')
print
print name
Ответ 4
Я думаю, что лучшее (самое простое и самое портативное) решение - это комбинация ответов @rlotun и @Stephen:
default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
Ответ 5
Не лучший аспект, но ради совместного использования...
Вы можете использовать Javascript для получения всех видов входов в IPython Notebook.
from IPython.display import HTML
newvar = ""
htm = """
<input id="inptval" style="width:60%;" type="text" value="This is an editable default value.">
<button onclick="set_value()" style="width:20%;">OK</button>
<script type="text/Javascript">
function set_value(){
var input_value = document.getElementById('inptval').value;
var command = "newvar = '" + input_value + "'";
var kernel = IPython.notebook.kernel;
kernel.execute(command);
}
</script>
"""
HTML(htm)
В следующей ячейке вы можете использовать новую переменную:
print newvar
Ответ 6
Это не очень хороший ответ, но это работа для окон. Насколько я старался, я не мог заставить Readline или pyReadline работать на моем компьютере с Windows 10 с Python Ver 3.5. Поэтому я написал это вместо этого. Не лучший код в мире, так как я только использовал Python в течение 3 месяцев. Но он работает.
import os
def note_input(defaultvalue):
#Create a textfile
txtfile = open("txtfile.txt", "w")
#
# populate it with the default value
txtfile.write(defaultvalue)
txtfile.close()
#
# call Notepad
os.system("notepad.exe txtfile.txt")
# input("Just holding until notepad is close : ") (did not need this line)
#
# get the Value Entered/Changed in Notepad
txtfile = open("txtfile.txt", "r")
func_value = txtfile.read()
txtfile.close()
return func_value
# END DEF
Блокнот остановил запуск программы до ее закрытия, поэтому строка ввода() под ней не нужна. Как только блокнот был открыт в первый раз и помещен туда, где я хотел его на экране, это было похоже на всплывающее окно ввода. Я предполагаю, что вы можете использовать любой текстовый редактор, например Notepad ++ или Scripe или Code Writer, и т.д.
Ответ 7
Если вы это сделаете, пользователь должен будет удалить существующее слово. Как насчет предоставления значения по умолчанию, если пользователь нажимает "return"?
>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder