可以显示 Python 输入编辑的默认值吗?

2025-01-15 08:45:00
admin
原创
78
摘要:问题描述:Python 是否可以接受这样的输入:文件夹名称:下载 但是用户无需输入“Download”,因为它已经作为初始值存在。如果用户想将其编辑为“Downloads”,他只需添加一个“s”并按回车键即可。使用正常输入命令:folder=input('Folder name: ') 我所能得到的只是一个空...

问题描述:

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()

例子

警告:

  1. 理论上,用户可以在完成之前按下一个键来在“默认”输入的中间插入字符typewrite

  2. pyautogui 在无头系统上非常不可靠,因此请确保提供备份解决方案以防导入失败。如果遇到No module named 'Xlib',请尝试安装python3-xlibpython-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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用