¿Es posible mostrar el valor predeterminado para editar en Python?

¿Es posible que Python acepte una entrada como esta?

 Nombre de la carpeta: Descargar

Pero en lugar de que el usuario escriba “Descargar”, ya está allí como un valor inicial. Si el usuario desea editarlo como “Descargas”, todo lo que tiene que hacer es agregar una ‘s’ y presionar intro.

Usando el comando de entrada normal:

folder=input('Folder name: ') 

todo lo que puedo obtener es un mensaje en blanco:

 Nombre de la carpeta:

¿Hay una forma sencilla de hacer esto que me estoy perdiendo?

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

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

Supongo que te refieres a la línea de comandos. Nunca he visto valores iniciales para indicaciones de línea de comandos, generalmente son de la forma:

  Folder [default] : 

que en código es simplemente:

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

Alternativamente, puedes intentar hacer algo usando el módulo de curses en Python.

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 

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

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

Me gustaría sugerir usar el portapapeles para resolver este problema. Pegue el portapapeles en la línea de entrada, edite según sea necesario, presione intro. La variable clpstack se utiliza para proteger el contenido del portapapeles existente. Este código es para Windows. Linux podría usar el portapapeles de importación.

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

Finalmente encontré una alternativa simple que funciona en Windows y Linux. Esencialmente, estoy usando el módulo pyautogui para simular la entrada del usuario. en la praxis, que se parece a esto:

 from pyautogui import typewrite print("enter folder name: ") typewrite("Default Value") folder = input() 

Ejemplo

Una palabra de advertencia:

  1. Teóricamente, el usuario puede insertar caracteres en medio de la entrada “predeterminada” presionando una tecla antes de que termine la typewrite .
  2. pyautogui es notoriamente poco confiable en sistemas sin cabeza, así que asegúrese de proporcionar una solución de respaldo en caso de que la importación falle. Si se encuentra con el No module named 'Xlib' , intente instalar el python3-xlib o python-xlib (o el módulo xlib ). Correr sobre ssh también puede ser un problema .

Un ejemplo de implementación alternativa:

Como un x-server faltante solo puede ocurrir lógicamente en linux, aquí hay una implementación que usa la respuesta de sth como alternativa:

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

No es el mejor enfoque, sino por compartir … Puede utilizar Javascript para obtener todo tipo de entradas en el cuaderno de IPython.

 from IPython.display import HTML newvar = "" htm = """    """ HTML(htm) 

En la siguiente celda puedes usar la nueva variable:

 print newvar 

Podemos usar Tkinter y usar StringVar para hacer esto. La limitación es que la entrada es a través de una ventana 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('', 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() 

Me gusta esto, funciona en ventana.

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

Esta no es una muy buena respuesta, pero es una solución para Windows. Tan duro como lo intenté, no pude hacer que Readline o pyReadline funcionaran en mi computadora con 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 estado usando 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 

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

Si lo haces, el usuario tendría que eliminar la palabra existente. ¿Qué hay de proporcionar un valor predeterminado si el usuario pulsa “devolver”?

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