可以显示 Python 输入编辑的默认值吗?
- 2025-01-15 08:45:00
- admin 原创
- 78
问题描述:
Python 是否可以接受这样的输入:
文件夹名称:下载
但是用户无需输入“Download”,因为它已经作为初始值存在。如果用户想将其编辑为“Downloads”,他只需添加一个“s”并按回车键即可。
使用正常输入命令:
folder=input('Folder name: ')
我所能得到的只是一个空白的提示:
文件夹名称:
有没有一种简单的方法可以做到这一点我却不知道?
解决方案 1:
标准库函数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()
解决方案 2:
我假设您指的是命令行。我从未见过命令行提示符的初始值,它们通常采用以下形式:
Folder [default] :
代码如下:
res = raw_input('Folder [default] : ')
res = res or 'default'
或者,您可以尝试使用Python 中的curses模块做一些事情。
解决方案 3:
这在 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
解决方案 4:
我终于找到了一个适用于 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()
解决方案 5:
我认为最好的(最简单和最便携的)解决方案是@rlotun 和@Stephen 答案的组合:
default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
解决方案 6:
我建议使用剪贴板来解决这个问题。将剪贴板粘贴到输入行中,根据需要编辑,按回车键。变量 clpstack 用于保护现有的剪贴板内容。此代码适用于 Windows。Linux 可以使用 import clipboard。
import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
HOST = input("Enter telnet host: ")
clp.copy(clpstack)
解决方案 7:
最近遇到了这个问题。上面的答案似乎都不是完美的。所以我做了一些研究,发现以下解决方案是最简单的,并且适用于 Windows 和 Linux:
import keyboard
def input_with_default(prompt_, default_):
keyboard.write(default_)
return input(prompt_)
if __name__ == "__main__":
print(input_with_default("Please enter: ", "hello world"))
解决方案 8:
我喜欢这个,它在窗口上工作
def inputWdefault(prompt, default):
bck = chr(8) * len(default)
ret = input(prompt + default + bck)
return ret or default
解决方案 9:
我发现PyInquirer非常有用,尤其是在频繁构建交互式控制台应用程序时。向用户提示默认可修改值的方式如下:
from PyInquirer import prompt
question = [
{
'type': 'input',
'name': 'first_name',
'message': 'Name please',
'default': 'Max'
}
]
answer = prompt(question)
print('Hello {}'.format(answer['first_name']))
解决方案 10:
我喜欢 @MCO 采取的方法,所以我重构了代码。我使用 Microsoft Terminal 在 X Windows 和 Microsoft Windows 10 WSL 2 上对其进行了测试:
def input_with_default(prompt, prefill=''):
try:
from pyautogui import typewrite
print(prompt)
typewrite(prefill)
return input()
except (ImportError, KeyError):
import readline
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return input(prompt)
finally:
readline.set_startup_hook()
解决方案 11:
虽然不是最好的方法,但为了分享...您可以使用 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
解决方案 12:
我们可以使用 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()
解决方案 13:
如果您正在编写 CLI,您可能需要考虑使用python-click
该库。
您可以使用以下代码实现您的目标:
import click
user_input = click.prompt(text="Folder name", default="Download")
print(f"{user_input=}")
如果你运行此代码并且不输入任何内容,则会得到:
$ python3 cli_code.py
Folder name [Download]:
user_input='Download'
如果您运行此代码并输入“my-dir”,那么您将获得:
$ python3 cli_code.py
Folder name [Download]: my-dir
user_input='my-dir'
解决方案 14:
尝试使用“f 字符串”和“或”组合,例如:
default_name = "that_folder"
this_folder = input(f"Folder name: ({default_name}) ") or default_name
print(this_folder)
如果您按下回车键而没有输入文件夹名称,则系统将采用 default_name。
解决方案 15:
简单方法:
max_blob_size = input("What is the threshold size? [Default = 1M]") or "1M"
解决方案 16:
这不是一个很好的答案,但它是 Windows 的一个解决方法。尽管我努力尝试,但我无法让 Readline 或 pyReadline 在装有 Python Ver 3.5 的 Windows10 计算机上运行。所以我写了这个。这不是世界上最好的代码,因为我只使用 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 等。
解决方案 17:
如果这样做,用户就必须删除现有的单词。如果用户点击“返回”,那么提供一个默认值怎么样?
>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder