String editieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jphan
User
Beiträge: 4
Registriert: Samstag 12. März 2005, 19:27

Samstag 12. März 2005, 19:58

Wie kann ich innerhalb eines Scripts einen vordefinierten String (aus einer Variablen) interaktiv editieren und anschließend wieder in eine andere Variable zurücklesen? Danke im Voraus!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Samstag 12. März 2005, 20:25

Hi!

Mir ist nicht ganz klar was Du meinst ("interaktiv editieren"?).Kannst Du bitte mal ein Beispiel zeigen.

Gruß, mawe
jphan
User
Beiträge: 4
Registriert: Samstag 12. März 2005, 19:27

Samstag 12. März 2005, 21:31

Hallo,

gebe zu, habe mich unklar ausgedrückt.

Also: Innerhalb des Ablaufs eines Scripts (nicht erst nach Beendigung am Prompt) möchte ich einen String an den Bildschirm bringen mit dem Cursor direkt dahinter, den String dann bearbeiten und die veränderte Fassung zurückschreiben, also so eine Art default-Vorgabe für raw_input erzeugen.

------------------------------------------------------
>>> execfile('/home/tmp/fragebogen.py')
.
.
Bitte die Anzahl eingeben:
100 | # der Strich soll den Cursor darstellen
------------------------------------------------------

Jetzt die vorgegebene Zahl editieren und mit Return wieder in eine Variable schreiben.
InteractiveConsole? readline? curses? gngngngn....

Grüße, jphan
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 12. März 2005, 21:47

Wie wäre es damit:

Code: Alles auswählen

import readline
def hook(): readline.insert_text("42")
readline.set_pre_input_hook(hook)
answer=raw_input("Sinn des Lebens? ")
print "answer =",answer
Allerdings brauchst du unter Windows readline aus den uncpythontools.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
jphan
User
Beiträge: 4
Registriert: Samstag 12. März 2005, 19:27

Samstag 12. März 2005, 22:08

Hallo,

danke! Ich versuche es mal!

Es wäre sehr praktisch, wenn raw_input noch ein zweites Argument akzeptieren würde,
etwa so: raw_input(prompt, default).....

Grüße, jphan
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 12. März 2005, 22:21

Ist auch möglich und wenn man Klassen verwendet vermeidet man global.

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 
import readline

class raw_input_imp(object):
    def __init__(self):
        self.default = None
        readline.set_pre_input_hook(self.hook)
    def hook(self):
        if self.default:
            readline.insert_text(self.default)
    def raw_input(self, text, default=None):
        self.default = default
        return raw_input(text)

if __name__ == '__main__':
    rii = raw_input_imp()
    answer = rii.raw_input("Sinn des Lebens: ", "42")
    print "Antwort =", answer
    answer = rii.raw_input("Sinn dieses Programms: ")
    print "Antwort =", answer
Edit: Man kann dann noch einige Tricks einsetzen um raw_input vollständig zu ersetzen, aber ob das ratsam ist, ist eine andere Sache.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
jphan
User
Beiträge: 4
Registriert: Samstag 12. März 2005, 19:27

Samstag 12. März 2005, 23:34

Hallo,

danke für die prima Anregungen!
So funktioniert es erstmal:

Code: Alles auswählen

import readline

def hook(): readline.insert_text('100 ')
readline.set_startup_hook(hook)

a = raw_input('Bitte Zahl eingeben: ')
print a

readline.set_startup_hook() # Vorgabe wieder entfernen
Grüße, jphan
Antworten