可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Is it possible for python to accept input like this:
Folder name: Download
But instead of the user typing \"Download\" it is already there as a initial value. If the user wants to edit it as \"Downloads\" all he has to do is add a \'s\' and press enter.
Using normal input command:
folder=input(\'Folder name: \')
all I can get is a blank prompt:
Folder name:
Is there a simple way to do this that I\'m missing?
回答1:
The standard library functions input()
and raw_input()
don\'t have this functionality. If you\'re using Linux you can use the readline
module to define an input function that uses a prefill value and advanced line editing:
def rlinput(prompt, prefill=\'\'):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(prompt)
finally:
readline.set_startup_hook()
回答2:
I\'m assuming you mean from the command-line. I\'ve never seen initial values for command line prompts, they\'re usually of the form:
Folder [default] :
which in code is simply:
res = raw_input(\'Folder [default] : \')
res = res or \'default\'
Alternatively, you can try to do something using the curses module in Python.
回答3:
This works in 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:
I think that the best (the easiest and most portable) solution is a combination of @rlotun and @Stephen answers:
default = \'/default/path/\'
dir = raw_input(\'Folder [%s]\' % default)
dir = dir or default
回答5:
I would like to suggest using the clipboard to solve this problem. Paste the clipboard into the input line, edit as required, press enter. Variable clpstack is used to protect existing clipboard contents. This code is for Windows. Linux could use import clipboard.
import pyperclip as clp
clpstack=clp.paste()
clp.copy(\"192.168.4.1\")
HOST = input(\"Enter telnet host: \")
clp.copy(clpstack)
回答6:
I finally found a simple alternative that works on Windows and Linux. Essentially, i\'m using the pyautogui module to simulate the user\'s input. in praxis, that looks like this:
from pyautogui import typewrite
print(\"enter folder name: \")
typewrite(\"Default Value\")
folder = input()
A Word of Warning:
- Theoretically, the user can insert characters in the middle of the \"default\" input by pressing a key before
typewrite
finishes.
- pyautogui is notoriously unreliable on headless systems, so make
sure to provide a backup solution in case the import fails. If you
run into
No module named \'Xlib\'
, try to install the python3-xlib
or python-xlib
package (or the xlib
module). Running over ssh can also be a
problem.
An example fallback implementation:
Since a missing x-server can logically only happen on linux, here\'s an implementation that uses sth\'s answer as fallback:
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()
回答7:
Not the best aproach but for the sake of sharing...
You could use Javascript to get all sort of inputs in 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)
On the next cell you can use the new variable:
print newvar
回答8:
We can use Tkinter and use a StringVar to do this. The limitation is that the input is through a Tkinter window.
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()
回答9:
I like this, It works on window
def inputWdefault(prompt, default):
bck = chr(8) * len(default)
ret = input(prompt + default + bck)
return ret or default
回答10:
This is not a very Good Answer but it is a work around for windows. As hard as I tried, I could not get Readline or pyReadline to work on my Windows10 computer with Python Ver 3.5. So I wrote this instead. Not the best code in the world since I\'ve only been using Python for 3 months. But it works.
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
Notepad stopped the program from running until it was closed, so the input() line below it was not needed. Once notepad was opened the first time and placed where I wanted it on the screen, It was like a popup input window. I assume you can use any text editor like Notepad++ or Scripe or Code Writer, etc.
回答11:
If you do that, the user would have to delete the existing word. What about providing a default value if the user hits \"return\"?
>>> default_folder = \"My Documents\"
>>> try: folder = input(\"folder name [%s]:\" %default_folder)
... except SyntaxError: folder = default_folder