编辑Python的输入可能显示默认值?编辑Python的输入可能显示默认值?(Show defaul

2019-05-09 08:16发布

有可能是蟒蛇接受这样的输入:

Folder name: Download

但是,而不是用户输入“下载”,它是已经存在的初始值。 如果用户希望编辑为“下载”,他所要做的就是添加一个“S”,然后按回车。

使用正常的输入命令:

folder=input('Folder name: ')

所有我能得到的是一个空白的提示:

Folder name:

有一个简单的方法来做到这一点,我失踪?

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


Answer 2:

我假设你在命令行的意思。 我从来没有见过的命令行提示,他们通常形式的是初始值:

     Folder [default] : 

这在代码仅仅是:

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

或者,你可以尝试使用做一些诅咒的Python模块。



Answer 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


Answer 4:

我认为最好的(最简单和最便携的)解决方案是@rlotun和@Stephen答案的组合:

default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default


Answer 5:

我想使用剪贴板来解决这个问题建议。 剪贴板粘贴到输入线,根据需要编辑,按回车键。 可变clpstack用于保护现有的剪贴板内容。 此代码是Windows。 Linux可能会出现使用进口剪贴板。

import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
HOST = input("Enter telnet host: ")
clp.copy(clpstack)


Answer 6:

我终于发现,在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上发生,这是一个使用某事的答案作为后备的实现:

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


Answer 7:

不是最好的形式给出,但对于共享的缘故...你可以使用JavaScript来获取所有种类的IPython的笔记本电脑的投入。

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


Answer 8:

我们可以用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()


Answer 9:

我喜欢这个,它适用于窗口

def inputWdefault(prompt, default):
    bck = chr(8) * len(default)
    ret = input(prompt + default + bck)
    return ret or default


Answer 10:

这不是一个很好的答案,但它是一个用于Windows的解决办法。 硬如我尝试,我不能得到的Readline或pyReadline与Python的版本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

记事本从运行,直到它被关闭停止程序,所以并不需要在它下面的输入()行。 一旦记事本打开的第一时间,放在哪里,我想在屏幕上,它就像一个弹出输入窗口。 我想你可以用任何文本编辑器如记事本++或Scripe或代码刻录机等



Answer 11:

如果你这样做,用户必须删除现有的字。 怎么样,如果用户点击“返回”提供的默认值?

>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder


文章来源: Show default value for editing on Python input possible?
标签: python input