Gespräch mit dem Benutzer

Was werden wir behandeln?
Wie der Benutzer Daten eingeben kann und wie man einmal eingebene Daten lesen kann. Wir werden sehen wie man sowohl numerische als auch stringbasierte Daten liest. Auch werden wir uns anschauen, wie wir Daten als Kommandozeilen-Argumente einlesen können.

Bislang haben unsere Programme immer mit statischen Daten gearbeitet. Das sind Daten, wie wir sie brauchen; wir können sie vor Programmablauf untersuchen und das Programm so schreiben, dass sie passen. Die meisten Programme sind nicht so. Die meisten Programme erwarten, das sie vom Benutzer angetrieben werden, letztendlich mit der Erweiterung, dass sie gesagt bekommen, welche Datei sie öffnen, editieren sollen usw. Andere verlangen vom Benutzer Daten an kritischen Stellen. Lass uns anschauen, wie man das machen kann, bevor wir weiter fortschreiten.

>>> print raw_input("Gib etwas ein: ")

Wie du im raw_input siehst, zeigt es das vorgegebene Prompt an und benennt, was der Benutzer als Antwort einzugeben hat. Wir können ihm auch eine Variable an dieser Stelle zuweisen:

antw = raw_input("Wie ist dein Name? ")
print "Moin, %s, schön dich zu treffen" % antw 

raw_input hat eine Kusine, input genannt. Der Unterschied ist, dass raw_input die Schriftzeichen ansammelt, die der Benutzer eingibt, und diese als String präsentiert, während input diese sammelt und versucht, diese in Zahlen umzuformen. Wenn der Benutzer zum Beispiel '1','2','3' eingibt, dann wird input diese 3 Character lesen und in die Zahl 123 verwandeln.

Wir benutzen input, um zu entscheiden, welche Multiplikationstabelle auszudrucken ist:

multiplikator = input("Welchen Multiplikator möchtest du? Wähle eine Zahl ")
for j in range(1,13):
   print "%d x %d = %d" % (j, multiplikator, j * multiplikator)

BASIC INPUT

In BASIC liest die INPUT - Anweisung die Eingabe des Benutzers so:

INPUT "Welchen Multiplikator möchtest du, wähle eine Zahl ";M
FOR J = 1 to 12
    PRINT M "x" J "= " M*J
NEXT J

Wie du siehst, ist dies Python sehr ähnlich, ausgenommen, dass du die Variable am Ende einsetzt. BASIC verwendet INPUT für Beides, Zahlen und Strings. Es gibt gewöhnlich noch ein paar Zusatzeigenschaften in der INPUT-Anweisung. Du solltest in der Dokumentation zu deiner eigenen Version nachschlagen.

Eingaben lesen in Tcl

Tcl hat seinen eigenen Eingabemechanismus, der sich auf Dateien gründet (was die Standardein- und -ausgabedateien beinhaltet) und auf einen Befehl, der gets heißt. Dieser liest Eingaben von der spezifizierten Datei, die in unserem Fall stdin sein wird. Die Tcl-Versionen unserer Programme sehen so aus:

puts -nonewline stdout "Welchen Multiplikator möchtest du? "
flush stdout
set mult [gets stdin]
for {set j 1} {$j <= 12} {incr j} {
    puts [format " %d x %d = %d" $j $mult [expr $mult * $j] ]
    }

Die -nonewline -Option bei puts verhindert, dass der Cursor sich nach Anzeige der Promptmeldung zur folgenden Zeile bewegt. flush erzwingt stdout, seinen Inhalt sofort zu schreiben, um sicher zu gehen, dass er auf dem Bildschirm erscheint. Die for-Schleife ist wieder identisch mit derjenigen, die wir schon im Schleifenkapitel sahen.

Parameter der Kommandozeile

Eine andere Eingabeart ist die Eingabe in die Kommandozeile. Du startest zum Beispiel deinen Texteditor so:

EDIT Foo.txt

Wie liest der Editor den Dateinamen?

Bei den meisten Sprachen ist das System mit einem Array oder einer Liste ausgestattet, die die Wörter der Kommandozeile enthalten. So wird das erste Element das Kommando selbst enthalten, das zweite Element wird das erste Argument sein, etc. Es gibt gewöhnlicherweise eine Art magische Variable, die die Anzahl der Listenelemente beinhaltet.

In Python ist diese Liste im sys Modul enthalten und heißt argv (für 'argument values'- Argument-Werte). Wir können die Elemente durch Indexierung oder Iteration über die Liste herausholen, und zwar so:

import sys
for item in sys.argv:
    print item
    
print "Das erste Argument war:", sys.argv[1]

Tcl's Befehlszeile

Tcl hat ein ähnliches Schema mit 3 Variablen: argv0 - der Befehlsname, argv - ein String, der den Rest der Befehlszeile beinhaltet und argc - mit der Anzahl der Worte in argv

Ein Beispiel für den Zugriff auf die Befehlszeilenargumente ist:

puts "der Befehl war: $argv0"
puts "Das erste Argument war:  [lindex $argv 0]"

Und BASIC

Während Tcl nicht den Besitz eines 'input'-Äquivalentes aufweisen kann, so scheint BASIC kein argv - Äquivalent zu haben, obwohl es möglich ist, die Fähigkeiten des Betriebssystems heranzuziehen, um auf diese zurück zu greifen. Das ist jedoch viel zu Fortgeschritten im Rahmen dieses Kurses und ich empfehle, dass du in BASIC-Programmen den Benutzer interaktiv zur Werteeingabe aufforderst.

Das war es jetzt, wie weit wir mit Benutzereingaben in diesem Kurs gehen. Es ist sehr primitiv, aber du kannst schon sehr nützliche Programme damit schreiben. In den frühen Tagen von Unix oder der PCs war dies die einzige Interaktion, die man hatte. Python, Tcl und BASIC (in seiner 'Visual' -Wiedergeburt) sind alle fähig, ausgeklügelte GUI Programme mit Fenstern, Dialogen usw. zu schreiben, aber das ist auch ein bisschen zu hochgegriffen für diesen Kurs. Es bleibt nur zu sagen, dass die Fallstudie ein kurzes Beispiel enthält, wie man eine Eingabe über GUI in Python erhält, aber wir werden nicht sehr viel darüber sagen, wie es funktioniert. Es sind Web-Lehrgänge erhältlich, dies zu tun, sobald du eine fundiertes Grundlage erhalten hast; ich werde einige in der Referenzseite angeben..

Zur Erinnerung
  • Benutze input zum Lesen von Zahlen, raw_input zum Lesen von Character/Strings.
  • Beide, input und raw_input, können den Benutzer durch Strings zur Eingabe auffordern.
  • BASIC's INPUT-Befehl kann für jede Art von Datentyp verwendet werden.
  • Befehlszeilen-Parameter können über die argv -Liste vom sys-Modul in Python importiert werden, wobei der erste Bestandteil der Name des Programmes ist.
  • TCL verwendet eine ähnlich genannte argv-Liste um seinen Befehlzeilen-Daten zu erhalten, aber der Programmname ist in dem separaten argv0
  • Die __name__-Variable wird auf "__main__" gesetzt, wenn das Modul von einer Befehlszeile (oder einem Doppelklick in Windows) abläuft.

zurück  weiter  Inhalt


Bei Fragen oder Hinweisen sende eine Nachricht in Englisch an alan.gauld@yahoo.co.uk oder in Deutsch an bup.schaefer@freenet.de