input im input

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
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dies geht auf der Kommandozeile so nicht.
Input gibt einen prompt aus. Die Eingabe folgt danach.
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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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 ')
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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()
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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 ')
?
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

danke, dass war hilfreich.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Also chr(Dezimalzahl) kann man auch als String angeben durch '\xHexzahl' oder '\Oktalzahl'
BlackJack

@Alfons Mittelmeyer: Und wenn Du im Terminal ``chr(27) + 'M'`` schreibst dann steht da etwas anderes als ``chr(27) + 'M'``? :mrgreen:
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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