web-dev-qa-db-fra.com

Afficher la valeur par défaut pour l'édition sur une entrée Python possible?

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?

51
kircheis

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

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.

17
rlotun

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

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

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

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

 Example

Un mot d'avertissement:

  1. Théoriquement, l'utilisateur peut insérer des caractères au milieu de la saisie "par défaut" en appuyant sur une touche avant la fin de typewrite.
  2. pyautogui est notoirement peu fiable sur les systèmes sans tête, assurez-vous donc de fournir une solution de sauvegarde en cas d'échec de l'importation. Si vous exécutez ____ dans 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 .

Un exemple d'implémentation de secours:

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

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

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

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
0
Rody From Argentina