webentwicklung-frage-antwort-db.com.de

Standardwert für die Bearbeitung der Python-Eingabe anzeigen möglich?

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?

51
kircheis

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

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.

17
rlotun

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
10
qtwtetrt

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)
2
pdbperks

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
2
uolot

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

 Example

Ein Wort der Warnung:

  1. Theoretisch kann der Benutzer Zeichen in die Mitte der "Standard" -Eingabe einfügen, indem er eine Taste drückt, bevor typewrite beendet wird.
  2. pyautogui ist auf Headless-Systemen bekanntermaßen unzuverlässig. Stellen Sie daher sicher, dass __. eine Sicherungslösung für den Fall eines fehlgeschlagenen Imports bereitstellt. Wenn Sie __.run in 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.

Beispiel für eine Fallback-Implementierung:

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

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
0
lalengua

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

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
0