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

Eingabekorrektur in einem Konsoleprogramm

Beitragvon mathi » 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

Beitragvon 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

Beitragvon mathi » 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

Beitragvon 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

Beitragvon mathi » 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:

Beitragvon Hyperion » 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

Beitragvon 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

Beitragvon mathi » 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

Beitragvon 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

Beitragvon mathi » 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

Beitragvon BlackJack » Mittwoch 23. Januar 2008, 12:00

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]