Seite 1 von 1

input im input

Verfasst: Samstag 12. August 2017, 21:40
von jan.b
ich wollte eine Reaktion auf eine alterseingabe programmieren, aber dabei habe ich folgendes Problem:
Input = Input("ich bin: jahre alt. ")
ich möchte, dass man in die Leerzeile sein alter eingeben kann aber ich weiß nicht, wie man python verständlich machen kann, dass das eingabe Feld innerhalb des Input strings ist.

Re: input im input

Verfasst: Samstag 12. August 2017, 22:20
von kbr
Dies geht auf der Kommandozeile so nicht.
Input gibt einen prompt aus. Die Eingabe folgt danach.

Re: input im input

Verfasst: Samstag 12. August 2017, 22:33
von BlackJack
@jan.b: Das geht mit `input()` nicht. `input()` und `print()` operieren auf der Standardein- und ausgabe des Prozesses, also auf rein seriellen Dateiobjekten. Wenn Du mehr Kontrolle über das Terminal brauchst musst Du so etwas wie `curses` oder `urwid` verwenden. Wobei unter Windows ein Ersatz für das `curses`-Modul aus der Standardbibliothek installiert werden muss, und ob `urwid` unter Windows läuft, weiss ich nicht.

Re: input im input

Verfasst: Samstag 12. August 2017, 23:02
von kbr
Wer schon einmal einen Fortschrittsbalken im Terminal gesehen hat, mag auf den Gedanken kommen, dass dies doch irgendwie gehen muss. In Verbindung mit input wird dies aber zu einer argen Frickelei geraten, die möglicherweise nicht auf andere OS's oder Umgebungen wie Jupyter übertragbar ist. Im speziellen mag man damit seinen Kumpels imponieren, ansonsten eher: bad idea.

Re: input im input

Verfasst: Samstag 12. August 2017, 23:13
von jan.b
kbr hat geschrieben:Wer schon einmal einen Fortschrittsbalken im Terminal gesehen hat, mag auf den Gedanken kommen, dass dies doch irgendwie gehen muss. In Verbindung mit input wird dies aber zu einer argen Frickelei geraten, die möglicherweise nicht auf andere OS's oder Umgebungen wie Jupyter übertragbar ist. Im speziellen mag man damit seinen Kumpels imponieren, ansonsten eher: bad idea.
ok thx

Re: input im input

Verfasst: Samstag 12. August 2017, 23:13
von jan.b
BlackJack hat geschrieben:@jan.b: Das geht mit `input()` nicht. `input()` und `print()` operieren auf der Standardein- und ausgabe des Prozesses, also auf rein seriellen Dateiobjekten. Wenn Du mehr Kontrolle über das Terminal brauchst musst Du so etwas wie `curses` oder `urwid` verwenden. Wobei unter Windows ein Ersatz für das `curses`-Modul aus der Standardbibliothek installiert werden muss, und ob `urwid` unter Windows läuft, weiss ich nicht.
danke

Re: input im input

Verfasst: Sonntag 13. August 2017, 00:28
von snafu
Hilfreich könnte asciimatics sein. Das ist ein recht mächtiges TUI-Framework für Linux, Windows und weitere Systeme. Es gibt auch ein Beispiel für ein kleines Programm zur Verwaltung von Kontakten. Davon kann man sich bestimmt was abgucken...

Re: input im input

Verfasst: Sonntag 13. August 2017, 09:00
von Alfons Mittelmeyer
jan.b hat geschrieben:ich möchte, dass man in die Leerzeile sein alter eingeben kann aber ich weiß nicht, wie man python verständlich machen kann, dass das eingabe Feld innerhalb des Input strings ist.
Also auf meiner Konsole (Linux) geht das:

Code: Alles auswählen

print('Ich bin:\n')
print('jahre alt'+chr(27)+'M'+chr(27)+'M')
a = input()
print('\n')
print(a)
Wenn es eine Leerzeile sein soll

Aber das ist auch nicht schlecht, oder?

Code: Alles auswählen

print('Ich bin:    Jahre alt')
a = input(chr(27)+'M\t ')
print(a)       
Wenn das mit dem Zeilenrücklauf nicht geht, das sollte gehen:

Code: Alles auswählen

a = input('Ich bin:    Jahre alt\b\b\b\b\b\b\b\b\b\b\b\b')
Oder noch kürzer:

Code: Alles auswählen

a = input('Ich bin:    Jahre alt\r\t ')

Re: input im input

Verfasst: Sonntag 13. August 2017, 09:33
von Alfons Mittelmeyer
Und so verzählt man sich nicht:

Code: Alles auswählen

a = input('Ich bin:    Jahre alt\rIch bin: ')
Das mit der Leerzeile schreibt man am Besten so, falls es geht:

Code: Alles auswählen

a = input('Ich bin:\n\nJahre alt\r'+chr(27)+'M')
print()

Re: input im input

Verfasst: Sonntag 13. August 2017, 14:42
von jan.b
Alfons Mittelmeyer hat geschrieben:
jan.b hat geschrieben:ich möchte, dass man in die Leerzeile sein alter eingeben kann aber ich weiß nicht, wie man python verständlich machen kann, dass das eingabe Feld innerhalb des Input strings ist.
Also auf meiner Konsole (Linux) geht das:

Code: Alles auswählen

print('Ich bin:\n')
print('jahre alt'+chr(27)+'M'+chr(27)+'M')
a = input()
print('\n')
print(a)
Wenn es eine Leerzeile sein soll

Aber das ist auch nicht schlecht, oder?

Code: Alles auswählen

print('Ich bin:    Jahre alt')
a = input(chr(27)+'M\t ')
print(a)       
Wenn das mit dem Zeilenrücklauf nicht geht, das sollte gehen:

Code: Alles auswählen

a = input('Ich bin:    Jahre alt\b\b\b\b\b\b\b\b\b\b\b\b')
Oder noch kürzer:

Code: Alles auswählen

a = input('Ich bin:    Jahre alt\r\t ')
danke für die antwort aber ich bin noch relativ unerfahren also was heißen \b, \n und diese ganze zeile (chr(27)+'M\t ')
?

Re: input im input

Verfasst: Sonntag 13. August 2017, 14:43
von jan.b
snafu hat geschrieben:Hilfreich könnte asciimatics sein. Das ist ein recht mächtiges TUI-Framework für Linux, Windows und weitere Systeme. Es gibt auch ein Beispiel für ein kleines Programm zur Verwaltung von Kontakten. Davon kann man sich bestimmt was abgucken...
thx

Re: input im input

Verfasst: Sonntag 13. August 2017, 14:58
von Alfons Mittelmeyer
jan.b hat geschrieben: danke für die antwort aber ich bin noch relativ unerfahren also was heißen \b, \n und diese ganze zeile (chr(27)+'M\t ')
?
Also, es gibt Zeichden wie a,b,c und es gibt Steuerzeichen, wie etwa neue Zeile. Das schreibt man in etlichen Programmiersprachen als '\n'

Das ist eine kurze Übersicht: http://www.ling.uni-potsdam.de/~kolb/c- ... euerz.html

\r bedeutet Wagenrücklyauf, also an den Anfang der Zeile gehen.
\b bedutet Backspace, das ist dein Zeichen zurück
\t ist der Tabulator, auf der Konsole normalerweise im Abstand von 8 Zeichen

Zeichen die da nicht vorkommen kann man auch mit chr(zahlenwert) schreiben.
Ein wichtiges Zeichen ist chr(27). Dieses Zeichen ist das Escape Zeichen. Escape gefolgt von weiteren Zeichen nennt man eine Escape Sequenz. Solche Escape Sequenzen benutzt man etwa um Funktionen bei Druckern anzusteuern oder auch Besonderheiten bei der Konsole. Ob es auf mehreren Geräten diese Sequenz gibt, ist allerdings fraglich, und was das bedeutet kann auch verschieden sein.

chr(27)+'M' bedeutet auf manchen Konsolen eine Zeile nach oben.

Das mit \r \n \t \b sollte aber überall funktionieren.

Diese Steuerzeichen stammen noch aus der Zeit der Fernschreiber. Die mußten nach rechts und nach unten drucken können - vielleicht auch nochmals nach links und wieder drüber drucken, damit man Fettschrift bekommt. Nach oben drucken, mußten sie aber nicht.

Re: input im input

Verfasst: Sonntag 13. August 2017, 15:04
von jan.b
danke, dass war hilfreich.

Re: input im input

Verfasst: Sonntag 13. August 2017, 15:48
von Sirius3
@jan.b: statt chr(27) + 'M' schreibt der normale Programmierer '\x1bM'. Das ist eine ANSI-Escapesequenz und wird somit von allen Terminals unterstützt die ANSI verstehen.

Re: input im input

Verfasst: Sonntag 13. August 2017, 16:20
von Alfons Mittelmeyer
Sirius3 hat geschrieben:@jan.b: statt chr(27) + 'M' schreibt der normale Programmierer '\x1bM'. Das ist eine ANSI-Escapesequenz und wird somit von allen Terminals unterstützt die ANSI verstehen.
Das ist Unsinn, wenn ich auf meinem Terminal \x1bM eingebe, dann steht auch \x1bM da.

Das Format '\x1bM' wird von C und C++ verstanden. Anscheinend von Python auch. Hatte ich nur nicht gewußt. Andere normale Programmierer schreiben aber auch: '\033M'

Nach \x folgt eine zweistellige Hexadezimalzahl. Und 0x1b bedeutet 1 * 16 + 11 = 27
Wenn nach \ eine Ziffer folgt, dann handelt es sich um eine dreistellige Oktalzahl
Die Oktalzahl 033 bedeutet dasselbe. Das sind nämlich 3 * 8 + 3 = 27

Re: input im input

Verfasst: Sonntag 13. August 2017, 16:23
von Alfons Mittelmeyer
Also chr(Dezimalzahl) kann man auch als String angeben durch '\xHexzahl' oder '\Oktalzahl'

Re: input im input

Verfasst: Sonntag 13. August 2017, 16:24
von BlackJack
@Alfons Mittelmeyer: Und wenn Du im Terminal ``chr(27) + 'M'`` schreibst dann steht da etwas anderes als ``chr(27) + 'M'``? :mrgreen:

Re: input im input

Verfasst: Sonntag 13. August 2017, 21:46
von Alfons Mittelmeyer
BlackJack hat geschrieben:@Alfons Mittelmeyer: Und wenn Du im Terminal ``chr(27) + 'M'`` schreibst dann steht da etwas anderes als ``chr(27) + 'M'``? :mrgreen:
Ich hatte auch nicht behauptet, dass das Terminal versteht, weil es eine Escape Sequenz wäre.