Eingabekorrektur in einem Konsoleprogramm

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Dienstag 22. Januar 2008, 07:59

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
BlackJack

Dienstag 22. Januar 2008, 09:20

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Dienstag 22. Januar 2008, 10:21

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] '
BlackJack

Dienstag 22. Januar 2008, 10:43

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Dienstag 22. Januar 2008, 10:48

achso, dass ist natürlich eine gute Idee :-)

So machen wir es, vielen Dank!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 22. Januar 2008, 19:39

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.
lunar

Dienstag 22. Januar 2008, 21:04

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Mittwoch 23. Januar 2008, 09:13

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.

:-)
BlackJack

Mittwoch 23. Januar 2008, 10:59

Für die ``with``-Answeisung braucht man ein ``from __future__ import with_statement`` als ersten Import im Modul.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Mittwoch 23. Januar 2008, 11:20

@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
BlackJack

Mittwoch 23. Januar 2008, 12:00

Muss wohl mal den Monitor putzen oder gründlicher lesen. Oder beides. :oops:
Antworten