2010-03-28 14 views
44

¿Es posible que pitón para aceptar la entrada como esta:Mostrar valor predeterminado para la edición en la entrada de Python posible?

 
Folder name: Download 

Pero en lugar de la tipificación de usuario "Descargar" ya está allí como un valor inicial. Si el usuario quiere editarlo como "Descargas", todo lo que tiene que hacer es agregar una 's' y presionar enter.

Mediante el comando de entrada normal:

folder=input('Folder name: ') 

todo lo que puedo conseguir es un indicador en blanco:

 
Folder name: 

¿Hay una manera simple de hacer esto que me falta?

Respuesta

53

Las funciones de biblioteca estándar input() y raw_input() no tienen esta funcionalidad. Si estás usando Linux puede utilizar el módulo de readline para definir una función de entrada que utiliza un valor de prellenado y edición avanzada línea:

def rlinput(prompt, prefill=''): 
    readline.set_startup_hook(lambda: readline.insert_text(prefill)) 
    try: 
     return raw_input(prompt) 
    finally: 
     readline.set_startup_hook() 
+0

Gracias por su respuesta, esto es lo que necesitaba. – kircheis

+3

También podría funcionar igual que en Mac OS X. [readline] (http://pypi.python.org/pypi/readline) o [pyreadline] (http://pypi.python.org/pypi/pyreadline) podría ser instalado por separado. – jfs

+1

en Windows no deberíamos haber estado en confianza :( –

15

Supongo que quiere decir desde la línea de comandos. Nunca he visto a los valores iniciales para la línea de comando solicita, por lo general son de la forma:

 Folder [default] : 

que a su código es simplemente:

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

Alternativamente, se puede tratar de hacer algo con el curses módulo en Python.

-3

Si lo hace, el usuario tendría que borrar la palabra existente. ¿Qué hay de proporcionar un valor predeterminado si el usuario pulsa "regresar"?

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

creo que la mejor (la más fácil y más portátil) solución es una combinación de @rlotun y @Stephen respuestas:

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

Me gusta este método porque permite que el valor predeterminado sea variable. – Metagrapher

+5

no permite editar el valor predeterminado – jfs

9

Esto funciona en 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 
+0

esto es solo para Python 3, ¿verdad? – sfranky

+1

Creo la respuesta anterior es solo para Python 2. El 'print name' es un obsequio muerto;) Para la solución Python 3 para Windows, vea mi respuesta a una pregunta similar, con un código ligeramente modificado: http://stackoverflow.com/a/ 32156249/4973698 – mbdevpl

0
No

la mejor aproach pero en aras de compartir ... Se puede usar Javascript para obtener todo tipo de insumos en 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) 

En la siguiente celda puede utilizar la nueva variable:

print newvar 
-1

Ésta no es una respuesta muy buena, pero es un trabajo en torno a las ventanas. Por mucho que lo intenté, no pude hacer que Readline o pyReadline funcionaran en mi computadora Windows10 con Python Ver 3.5. Así que escribí esto en su lugar. No es el mejor código del mundo ya que solo he usado Python durante 3 meses. Pero funciona.

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 

Bloc de notas detuvo el programa se ejecute hasta que fue cerrado, por lo que no era necesaria la línea de entrada() debajo de ella. Una vez que se abrió el bloc de notas la primera vez y se colocó donde yo quería en la pantalla, era como una ventana emergente de entrada.Supongo que puede usar cualquier editor de texto como Notepad ++ o Scripe o Code Writer, etc.

Cuestiones relacionadas