Подтвердить что ты не робот

Как поместить текст в строку ввода: как запросить ввод пользователя в командной строке, предоставляя ответ "по умолчанию", который пользователь может редактировать или удалять?

Я создаю Python script, который запрашивает ввод из командной строки. Пользователь будет иметь возможность редактировать часть файла. Я могу попросить новую информацию и перезаписать ее в файле, без проблем. Но я предпочел бы, чтобы часть редактирования уже была вставлена ​​в командную строку, поэтому ее не нужно набирать полностью. Возможно ли это?

Файл:

1|This file
2|is not empty

Пример:

>>>edit line 2
Fetching line 2
Edit the line then hit enter
>>>is not empty                  #This is written here by the script, not by the user

Который может быть изменен на

>>>is not full either
Edited file

Afther, для которого файл был изменен:

1|This file
2|is not full either

Я надеюсь, что это ясно, что я пытаюсь выполнить.

Этот вопрос, как говорили, отвечает на мой вопрос, это в определенной степени. Это происходит, когда я запускаю Linux с readline. Однако я не уверен. Я использую Windows и не использую readline. Я бы хотел использовать только стандартную библиотеку.
Ответ на Windows также предоставляется с этим вопросом. Однако я получаю ImportError с win32console, возможно, потому, что упомянутый вопрос касается не Python3.4, а мой. Кроме того, мне было интересно, возможно ли это со стандартной библиотекой, а не с внешней библиотекой.

4b9b3361

Ответ 1

К сожалению, я не знаю, доступен ли в стандартной библиотеке тип input() со значением по умолчанию.

Существует внешнее решение - используйте win32console, как указано в этом ответе. Насколько я могу судить, у него есть две ошибки. Во-первых, импорт поставляется в пакете pywin32. Таким образом, вы использовали бы pip install pywin32, за исключением того, что он не работает, из-за второй ловушки: информация о пакете в pypi устарела, в нем говорится, что пакет несовместим с Python 3.4...

Но на самом деле он может работать! Вы должны следовать "URL-адресу загрузки", видимому на странице проекта pypi (т.е. https://sourceforge.net/projects/pywin32/files/pywin32/) и установить последнюю версию. Я только что установил build 219 для Py3.4, так как сам я также использую эту версию Python. На странице установщики предоставляются для нескольких версий Python для 32-битной и 64-битной Windows.

Кроме того, я изменил код из вышеприведенного SO-ответа для работы в Python 3:

import win32console

_stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)

def input_def(prompt, default=''):
    keys = []
    for c in str(default):
        evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
        evt.Char = c
        evt.RepeatCount = 1
        evt.KeyDown = True
        keys.append(evt)

    _stdin.WriteConsoleInput(keys)
    return input(prompt)

if __name__ == '__main__':
    name = input_def('Folder name: ', 'it works!!!')
    print()
    print(name)

Это работает на моей машине Windows... Если это не работает на вашем компьютере, можете ли вы предоставить сообщение об ошибке?

Ответ 2

Вы можете сделать это с помощью tkinter:

from tkinter import *
def enter():
    global commandEntry
    command = commandEntry.get()
    # Do stuff with command
    commandEntry.delete(0, END)
def edit_line(line):
    global commandEntry
    commandEntry.insert(0, line)
root = Tk()
messageVar = StringVar()
messageVar.set("Enter a command:")
message = Label(root, textvariable=messageVar)
commandEntry = Entry(root)
enterButton = Button(root, text="Enter", command=enter)
root.mainloop()

Ответ 3

У вас должно быть только две переменные: одна для стандартной строки, одна для строки, которая будет меняться пользователем самостоятельно. Как:

str1 = 'String that is standard'
str2 = str1 #it usually will be standard string
usr = input('your text goes here')
if len(usr) != 0:
    str2 = usr
#and here goes code for writing string into file