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