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.
input im input
@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.
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 thxkbr 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.
dankeBlackJack 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.
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...
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Also auf meiner Konsole (Linux) geht das: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.
Code: Alles auswählen
print('Ich bin:\n')
print('jahre alt'+chr(27)+'M'+chr(27)+'M')
a = input()
print('\n')
print(a)
Aber das ist auch nicht schlecht, oder?
Code: Alles auswählen
print('Ich bin: Jahre alt')
a = input(chr(27)+'M\t ')
print(a)
Code: Alles auswählen
a = input('Ich bin: Jahre alt\b\b\b\b\b\b\b\b\b\b\b\b')
Code: Alles auswählen
a = input('Ich bin: Jahre alt\r\t ')
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Und so verzählt man sich nicht:
Das mit der Leerzeile schreibt man am Besten so, falls es geht:
Code: Alles auswählen
a = input('Ich bin: Jahre alt\rIch bin: ')
Code: Alles auswählen
a = input('Ich bin:\n\nJahre alt\r'+chr(27)+'M')
print()
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 ')Alfons Mittelmeyer hat geschrieben:Also auf meiner Konsole (Linux) geht das: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.Wenn es eine Leerzeile sein sollCode: Alles auswählen
print('Ich bin:\n') print('jahre alt'+chr(27)+'M'+chr(27)+'M') a = input() print('\n') print(a)
Aber das ist auch nicht schlecht, oder?
Wenn das mit dem Zeilenrücklauf nicht geht, das sollte gehen:Code: Alles auswählen
print('Ich bin: Jahre alt') a = input(chr(27)+'M\t ') print(a)
Oder noch kürzer:Code: Alles auswählen
a = input('Ich bin: Jahre alt\b\b\b\b\b\b\b\b\b\b\b\b')
Code: Alles auswählen
a = input('Ich bin: Jahre alt\r\t ')
?
thxsnafu 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...
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Also, es gibt Zeichden wie a,b,c und es gibt Steuerzeichen, wie etwa neue Zeile. Das schreibt man in etlichen Programmiersprachen als '\n'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 ')
?
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.
@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.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Das ist Unsinn, wenn ich auf meinem Terminal \x1bM eingebe, dann steht auch \x1bM da.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 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
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Also chr(Dezimalzahl) kann man auch als String angeben durch '\xHexzahl' oder '\Oktalzahl'
@Alfons Mittelmeyer: Und wenn Du im Terminal ``chr(27) + 'M'`` schreibst dann steht da etwas anderes als ``chr(27) + 'M'``?
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Ich hatte auch nicht behauptet, dass das Terminal versteht, weil es eine Escape Sequenz wäre.BlackJack hat geschrieben:@Alfons Mittelmeyer: Und wenn Du im Terminal ``chr(27) + 'M'`` schreibst dann steht da etwas anderes als ``chr(27) + 'M'``?