Seite 1 von 1

Eingabekorrektur in einem Konsoleprogramm

Verfasst: Dienstag 22. Januar 2008, 07:59
von mathi
Hallo,
ist es möglich, in einem Konsoleprogramm mit vielen aufeinanderfolgenden eingaben - eine Eingabekorrektur einzubauen?
Etwas wie: Strg+z ruft die letzte Eingabe nocheinmal auf.

Ich stelle mir das schwierig vor.

Gruß mathi

Verfasst: Dienstag 22. Januar 2008, 09:20
von BlackJack
Du könntest eine Funktion schreiben, die eine ganze Reihe von Eingaben entgegennimmt, die am Ende noch einmal ausgibt und nachfragt, ob noch etwas geändert werden soll. Wenn nein, dann werden die Eingaben an den Aufrufer zurück gegegeben, wenn ja, dann kann man sich eine Eingabe aussuchen und die noch einmal tätigen. Und dann wird wieder gefragt, ob alles korrekt ist.

Verfasst: Dienstag 22. Januar 2008, 10:21
von mathi
genau das habe ich im Moment, aber ich habe mich schon selber geärgert, 10 Eingaben und bei der 11. vertippt :-)

was ich nicht möchte, sind zu viele sicherheitsabfragen, also z.B. nach 3 Eingaben:

Code: Alles auswählen

print 'Sind die Eingaben richtig? [J/n] '

Verfasst: Dienstag 22. Januar 2008, 10:43
von BlackJack
Dann hast Du nicht dass was ich vorgeschlagen habe: Am Ende soll man sich die Eingabe *aussuchen*, die man noch einmal neu machen möchte. Man sagt dann einfach Eingabe 11 möchte ich noch einmal machen, ohne die anderen 10 noch einmal machen zu müssen.

Verfasst: Dienstag 22. Januar 2008, 10:48
von mathi
achso, dass ist natürlich eine gute Idee :-)

So machen wir es, vielen Dank!

Verfasst: Dienstag 22. Januar 2008, 19:39
von Hyperion
Erinnert mich ein wenig an das gute alte Commodere Basic V2.0 aufm C64 :)

Da hatten die BASIC Befehlszeilen auch Nummern. Diese konnte man listen mit LIST oder auch so was wie LIST 100-150. Naja, wenn man folgendes getippt hat, konnte man eine Zeile anlegen / ändern:

Code: Alles auswählen

10 print "Hallo Welt!"<RETURN>
So ähnlich könnteste das doch auch basteln! Quasi nen dict mit Zeilennummer und Inhaltsstring.

Verfasst: Dienstag 22. Januar 2008, 21:04
von lunar
Die Abfrage am Ende kann man übrigens auch komfortabler realisieren, in dem man mit readline arbeitet. So kann man die zu korrigierende Zeile direkt in die Eingabezeile von "raw_input" einfügen:

Code: Alles auswählen

from __future__ import with_statement
import readline

class readline_insert(object):
    """A class which provides a facility to insert text to the command
    line. Intend for you with the ``with`` statement:

    ::

        with readline_insert('foo'):
            print raw_input('Your Name is: ')
    """
    def __init__(self, value):
        self.value = value

    def __enter__(self):
        self.old_hook = readline.set_pre_input_hook(self.input_hook)

    def __exit__(self, exc_type, exc_value, traceback):
        readline.set_pre_input_hook(self.old_hook)

    def input_hook(self):
        readline.insert_text(self.value)
        readline.redisplay()

# bei der Korrektur:
with readline_insert(vorherige_eingabe):
    raw_input('Bitte korrigieren: ')
Auf der Eingabezeile wird nun direkt der Wert von "vorherige Eingabezeile" angezeigt.

Verfasst: Mittwoch 23. Januar 2008, 09:13
von mathi

Code: Alles auswählen

from __future__ import with_statement 
import readline 

class readline_insert(object): 
    """A class which provides a facility to insert text to the command 
    line. Intend for you with the ``with`` statement: 

    :: 

        with readline_insert('foo'): 
            print raw_input('Your Name is: ') 
    """ 
    def __init__(self, value): 
        self.value = value 

    def __enter__(self): 
        self.old_hook = readline.set_pre_input_hook(self.input_hook) 

    def __exit__(self, exc_type, exc_value, traceback): 
        readline.set_pre_input_hook(self.old_hook) 

    def input_hook(self): 
        readline.insert_text(self.value) 
        readline.redisplay() 

c=raw_input('eingabe')
# bei der Korrektur: 
with readline_insert(c): 
    raw_input('Bitte korrigieren: ')
print c
Funktioniert so nicht, ich müßte

Code: Alles auswählen

with readline_insert(c): 
    c=raw_input('Bitte korrigieren: ')
eingeben, aber die vorherige Eingabe erscheint bei mir nicht.

:-)

Verfasst: Mittwoch 23. Januar 2008, 10:59
von BlackJack
Für die ``with``-Answeisung braucht man ein ``from __future__ import with_statement`` als ersten Import im Modul.

Verfasst: Mittwoch 23. Januar 2008, 11:20
von mathi
@BlackJack:

Mißverständnis:
das 2. Schnippsel gehört in das erste--> die einzige Änderung ist die Zuweisung von also: ersetze Zeile 30 durch Zeile 3

Verfasst: Mittwoch 23. Januar 2008, 12:00
von BlackJack
Muss wohl mal den Monitor putzen oder gründlicher lesen. Oder beides. :oops: