Est-il possible pour Python d'accepter une entrée comme ceci:
Nom du dossier: Télécharger
Mais au lieu que l'utilisateur tape "Télécharger", il est déjà là comme valeur initiale. Si l'utilisateur veut l'éditer en tant que "Téléchargements", il n'a qu'à ajouter un 's' et appuyer sur Entrée.
Utilisation de la commande d'entrée normale:
folder=input('Folder name: ')
tout ce que je peux obtenir, c'est une invite vierge:
Nom de dossier:
Y at-il un moyen simple de faire cela qui me manque?
Les fonctions de bibliothèque standard input()
et raw_input()
n'ont pas cette fonctionnalité. Si vous utilisez Linux, vous pouvez utiliser le module readline
pour définir une fonction d'entrée qui utilise une valeur de préremplissage et une édition de ligne avancée:
def rlinput(Prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(Prompt)
finally:
readline.set_startup_hook()
Je suppose que vous voulez dire depuis la ligne de commande. Je n'ai jamais vu les valeurs initiales pour les invites de ligne de commande, elles ont généralement la forme suivante:
Folder [default] :
qui dans le code est simplement:
res = raw_input('Folder [default] : ')
res = res or 'default'
Alternativement, vous pouvez essayer de faire quelque chose en utilisant le module curses de Python.
Cela fonctionne dans les fenêtres.
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
Je voudrais suggérer d'utiliser le presse-papiers pour résoudre ce problème. Collez le presse-papiers dans la ligne de saisie, modifiez-le selon vos besoins, appuyez sur entrée. La variable clpstack est utilisée pour protéger le contenu du presse-papiers existant. Ce code est pour Windows. Linux pourrait utiliser le presse-papier d'importation.
import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
Host = input("Enter telnet Host: ")
clp.copy(clpstack)
Je pense que la meilleure solution (la plus facile et la plus portable) est une combinaison des réponses @rlotun et @Stephen:
default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
J'ai finalement trouvé une alternative simple qui fonctionne sous Windows et Linux. J'utilise essentiellement le module pyautogui pour simuler les entrées de l'utilisateur. dans la pratique, cela ressemble à ceci:
from pyautogui import typewrite
print("enter folder name: ")
typewrite("Default Value")
folder = input()
typewrite
.No module named 'Xlib'
, essayez d’installer le package python3-xlib
.__ ou python-xlib
(ou le module xlib
). Courir sur ssh peut aussi être un problème .Comme un serveur x manquant ne peut se produire logiquement que sur Linux, voici une implémentation qui utilise la réponse de sth comme solution de secours:
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()
Ce n'est pas la meilleure approche mais pour le partage .... Vous pouvez utiliser Javascript pour obtenir toutes sortes d'entrées dans 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)
Sur la cellule suivante, vous pouvez utiliser la nouvelle variable:
print newvar
Nous pouvons utiliser Tkinter et utiliser un StringVar pour le faire. La limitation est que l'entrée se fait par une fenêtre 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('<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()
J'aime ça, ça marche sur la fenêtre
def inputWdefault(Prompt, default):
bck = chr(8) * len(default)
ret = input(Prompt + default + bck)
return ret or default