Показать значение по умолчанию для редактирования на входе 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()

Example

предупреждения:

  1. теоретически пользователь может вставлять символы в середине ввода "по умолчанию", нажав клавишу перед typewrite заканчивается.
  2. 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