Ist es möglich, dass Python eine Eingabe wie folgt akzeptiert:
Ordnername: Herunterladen
Aber anstatt den Benutzer "Download" einzugeben, ist er bereits als Anfangswert vorhanden. Wenn der Benutzer es als "Downloads" bearbeiten möchte, muss er lediglich ein "s" hinzufügen und die Eingabetaste drücken.
Normalen Eingabebefehl verwenden:
folder=input('Folder name: ')
ich kann nur eine leere Eingabeaufforderung erhalten:
Ordnernamen:
Gibt es eine einfache Möglichkeit, die mir fehlt?
Die Standard-Bibliotheksfunktionen input()
und raw_input()
verfügen nicht über diese Funktionalität. Wenn Sie Linux verwenden, können Sie mit dem Modul readline
eine Eingabefunktion definieren, die einen Prefill-Wert und eine erweiterte Zeilenbearbeitung verwendet:
def rlinput(Prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(Prompt)
finally:
readline.set_startup_hook()
Ich gehe davon aus, dass Sie von der Befehlszeile aus meinen. Ich habe noch nie Anfangswerte für Befehlszeilenaufforderungen gesehen, die normalerweise folgende Form haben:
Folder [default] :
was im Code ist einfach:
res = raw_input('Folder [default] : ')
res = res or 'default'
Alternativ können Sie versuchen, mit dem Modul curses in Python etwas zu tun.
Das funktioniert in Fenstern.
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 __== '__main__':
name = input_def('Folder name: ')
print
print name
Ich möchte vorschlagen, die Zwischenablage zu verwenden, um dieses Problem zu lösen. Fügen Sie die Zwischenablage in die Eingabezeile ein, bearbeiten Sie sie nach Bedarf und drücken Sie die Eingabetaste. Variable clpstack wird verwendet, um vorhandene Inhalte der Zwischenablage zu schützen. Dieser Code ist für Windows. Linux könnte Import-Zwischenablage verwenden.
import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
Host = input("Enter telnet Host: ")
clp.copy(clpstack)
Ich denke, dass die beste (die einfachste und tragbarste) Lösung eine Kombination von @rlotun und @Stephen ist:
default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
Ich habe endlich eine einfache Alternative gefunden, die unter Windows und Linux funktioniert. Im Wesentlichen verwende ich das Modul pyautogui , um die Eingaben des Benutzers zu simulieren. In der Praxis sieht das so aus:
from pyautogui import typewrite
print("enter folder name: ")
typewrite("Default Value")
folder = input()
typewrite
beendet wird.No module named 'Xlib'
laufen, versuchen Sie, das python3-xlib
Oder python-xlib
-Paket (oder das xlib
-Modul) zu installieren. Das Laufen über ssh kann auch ein Problem sein.Da ein fehlender X-Server logischerweise nur unter Linux vorkommen kann, wird hier eine Implementierung verwendet, die die Antwort von sth als Fallback verwendet:
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()
Nicht der beste Ansatz, aber aus Gründen des Austauschs ..... Sie könnten Javascript verwenden, um alle möglichen Eingaben in IPython Notebook zu erhalten.
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)
In der nächsten Zelle können Sie die neue Variable verwenden:
print newvar
Wir können Tkinter verwenden und dazu eine StringVar verwenden. Die Einschränkung ist, dass die Eingabe über ein Tkinter-Fenster erfolgt.
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 __== '__main__':
main()
Ich mag das, es funktioniert am Fenster
def inputWdefault(Prompt, default):
bck = chr(8) * len(default)
ret = input(Prompt + default + bck)
return ret or default