Показать значение по умолчанию для редактирования на входе Python возможно? - PullRequest
56 голосов
/ 28 марта 2010

Возможно ли для Python принимать ввод следующим образом:

Folder name: Download

Но вместо того, чтобы пользователь вводил «Download», он уже есть в качестве начального значения. Если пользователь хочет изменить его как «Загрузки», все, что ему нужно сделать, это добавить «s» и нажать клавишу ввода.

Используя обычную команду ввода:

folder=input('Folder name: ')

все, что я могу получить, это пустое приглашение:

Folder name:

Есть ли простой способ сделать это, что мне не хватает?

Ответы [ 11 ]

61 голосов
/ 28 марта 2010

Стандартные библиотечные функции input() и raw_input() не имеют этой функции. Если вы используете Linux, вы можете использовать модуль readline для определения функции ввода, которая использует значение предзаполнения и расширенное редактирование строки:

import readline

def rlinput(prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return input(prompt)  # or raw_input in Python 2
   finally:
      readline.set_startup_hook()
17 голосов
/ 28 марта 2010

Я предполагаю, что вы имеете в виду из командной строки. Я никогда не видел начальных значений для приглашений командной строки, они обычно имеют вид:

     Folder [default] : 

что в коде просто:

     res = raw_input('Folder [default] : ')
     res = res or 'default'

Кроме того, вы можете попробовать что-то сделать, используя модуль curses в Python.

10 голосов
/ 04 мая 2011

Это работает в 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
2 голосов
/ 18 мая 2018

Я хотел бы предложить использовать буфер обмена для решения этой проблемы. Вставьте буфер обмена в строку ввода, отредактируйте, как требуется, нажмите ввод. Переменная clpstack используется для защиты существующего содержимого буфера обмена. Этот код для Windows. Linux может использовать буфер обмена импорта.

import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
HOST = input("Enter telnet host: ")
clp.copy(clpstack)
2 голосов
/ 28 марта 2010

Я думаю, что лучшее (самое простое и портативное) решение - это сочетание ответов @rlotun и @Stephen:

default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
1 голос
/ 17 сентября 2018

Я наконец нашел простую альтернативу, которая работает на 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()
0 голосов
/ 22 августа 2018

Мне нравится это, работает на окне

def inputWdefault(prompt, default):
    bck = chr(8) * len(default)
    ret = input(prompt + default + bck)
    return ret or default
0 голосов
/ 04 апреля 2018

Мы можем использовать 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()
0 голосов
/ 22 марта 2017

Это не очень хороший ответ, но это обходной путь для окон. Как бы я ни старался, я не мог заставить 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

Блокнот не давал программе работать до тех пор, пока она не была закрыта, поэтому строка input () под ней не нужна. Как только блокнот был открыт в первый раз и помещен туда, где я хотел, на экране, это было похоже на всплывающее окно ввода. Я предполагаю, что вы можете использовать любой текстовый редактор, например Notepad ++ или Scripe или Code Writer и т. Д.

0 голосов
/ 16 марта 2014

Не лучший подход, но ради того, чтобы делиться ... Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...