Показать значение по умолчанию для редактирования на входе Python возможно?
возможно ли, чтобы python принимал такие входные данные:
Folder name: Download
но вместо ввода пользователем "загрузить" он уже существует в качестве начального значения. Если пользователь хочет отредактировать его как "загрузки", все, что ему нужно сделать, это добавить " s " и нажать enter.
С помощью обычной команды ввода:
folder=input('Folder name: ')
все, что я могу сделать-это пустые строки:
Folder name:
есть ли простой способ сделать это, что я упускаю?
11 ответов
стандартные функции библиотеки input()
и raw_input()
не имеют этой функции. Если вы используете Linux, вы можете использовать readline
модуль для определения функции ввода, которая использует значение prefill и расширенное редактирование строки:
def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(prompt)
finally:
readline.set_startup_hook()
Я предполагаю, что вы имеете в виду из командной строки. Я никогда не видел начальных значений для подсказок командной строки, они обычно имеют форму:
Folder [default] :
что в коде просто:
res = raw_input('Folder [default] : ')
res = res or 'default'
кроме того, вы можете попробовать что-то сделать с помощью проклятие модуль в Python.
это работает в windows.
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
Я думаю, что лучшее (самое простое и портативное) решение-это комбинация ответов @rlotun и @Stephen:
default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
Я хотел бы предложить использовать буфер обмена для решения этой проблемы. Вставьте буфер обмена в строку ввода, при необходимости отредактируйте, нажмите enter. Переменная clpstack используется для защиты существующего содержимого буфера обмена. Этот код для Windows. Linux может использовать буфер обмена импорта.
import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
HOST = input("Enter telnet host: ")
clp.copy(clpstack)
не лучший aproach, но ради обмена... Вы можете использовать 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
мы можем использовать Tkinter и использовать StringVar для этого. Ограничение заключается в том, что вход через окно Tkinter.
from tkinter import Tk, LEFT, BOTH, StringVar
from tkinter.ttk import Entry, Frame
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Entry")
self.pack(fill=BOTH, expand=1)
self.contents = StringVar()
# give the StringVar a default value
self.contents.set('test')
self.entry = Entry(self)
self.entry.pack(side=LEFT, padx=15)
self.entry["textvariable"] = self.contents
self.entry.bind('<Key-Return>', self.on_changed)
def on_changed(self, event):
print('contents: {}'.format(self.contents.get()))
return True
def main():
root = Tk()
ex = Example(root)
root.geometry("250x100+300+300")
root.mainloop()
if __name__ == '__main__':
main()
мне это нравится, он работает на window
def inputWdefault(prompt, default):
bck = chr(8) * len(default)
ret = input(prompt + default + bck)
return ret or default
я, наконец, нашел простую альтернативу, которая работает на Windows и Linux. По сути, я использую pyautogui модуль для имитации пользовательского ввода. на практике, это выглядит так:
from pyautogui import typewrite
print("enter folder name: ")
typewrite("Default Value")
folder = input()
предупреждения:
- теоретически пользователь может вставлять символы в середине ввода "по умолчанию", нажав клавишу перед
typewrite
заканчивается. - pyautogui заведомо ненадежно на безголовых системах, поэтому сделайте
обязательно предоставьте решение для резервного копирования в случае сбоя импорта. Если вы
бегите в
No module named 'Xlib'
, попробуйте установитьpython3-xlib
илиpython-xlib
пакета (илиxlib
модуль). Запуск через ssh также может быть проблема.
пример резервной реализации:
поскольку отсутствующий x-сервер может логически произойти только в linux, вот реализация, которая использует ответ sth в качестве резервного:
try:
from pyautogui import typewrite
autogui = True
except (ImportError, KeyError):
import readline
autogui = False
def rlinput(prompt, prefill=''):
if autogui:
print(prompt)
typewrite(prefill)
return input()
else:
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return input(prompt)
finally:
readline.set_startup_hook()
Это не очень хороший ответ, но это работа для windows. Как я ни старался, я не мог заставить Readline или pyReadline работать на моем компьютере Windows10 с 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 и т. д.
Если вы это сделаете, пользователю придется удалить существующее слово. Что обеспечивает значение по умолчанию, если пользователь нажимает "вернуть"?
>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder