Python Countdown in einer Zeile ausgeben?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

mit

print(deineAusgabe, end='\r') 

sollte es gehen.

Und die Tastatur kann man mit pynput abfragen. Dazu musst du dir einen listener anlegen, der dann kurz eine von dir geschriebene Funktion aufruft, auch wenn dein Programm gerade in einer Schleife ist.

Desweiteren kann man den Input der Tastatur abfangen, sodass er nicht im Terminal erscheint...

Wenn du nicht weiter weißt, lass es mich wissen.

verreisterNutzer  08.01.2020, 22:27

Perfekt das hab ich gesucht :D

Was hab ich dem Programm jetzt mit end='\r' genau gesagt?

0
Kreasteve  08.01.2020, 23:50
@verreisterNutzer

Du hast der print-Funktion damit gesagt, dass es nach dem Text wieder zurückspringen soll.

Standard ist '\n' also Zeilenumbruch.

Wenn man ein bisschen googelt findet mann, dass print in etwa so definiert ist:

def print(object(s), separator='' , end='\n', file=sys.stdout, flush=False):
	#... 

Also kannst du kannst die print-Funktion entsprechend verändern... wie zum Beispiel, dass kein Zeilenumbruch gemacht wird, sondern in der Zeile zurück gesprungen wird.

1

Was Du machen möchtest ist abhängig vom System. Wenn das Terminal ANSI Steuercodes versteht ist das eine einfache Möglichkeit.

verreisterNutzer  08.01.2020, 22:24

Es soll bitte was verstehen? Also ich möchte ein Timer programmieren der in einer Zeile ausgegeben wird und herunterzählt. Das ganze möchte ich auf einen Raspberry Pi packen, welcher dann nach Ablauf der Zeit ein Signal geben soll. Als Betriebssystem hätte ich Linux verwendet.

Was heißt "ANSI Steuercodes"? (sry, bin blutiger Anfänger)

Danke schon mal im Voraus für die Erklärung ;D

0
KarlRanseierIII  08.01.2020, 22:36
@verreisterNutzer

Beim Linux Terminal (und vielen klassischen Terminals) gibt es Steuerzeichen (Steuercodes), wenn man diese Ausgibt, werden deise vom Terminal interpretiert. Bewege Cursor auf Bildschirm, ändere Farbgebung etc. pp. .

Mit etwas Glück reicht es sogar ein \r (Carriage-Return - zurück zum Zeilenanfang) auszugeben.

https://de.wikipedia.org/wiki/ANSI-Escapesequenz

Hier wird das Prinzip erklärt.

sys.stdout.write("[\033[31mFAIL\033[0m]\033[?25h\033[K\n")

Versuch das mal, hier werden ESC-Sequenzen zur Farbausgabe verwendet.

Oder auch:

 print("Hallo\rWelt")

Hier wird mit \r wieder an den Zeilenanfang gegangen.

1

ich hab net so viel Erfahrung aber wenn du schreibst for i in ... wirds doch immer wieder 'geprintet' ? kann es sein, dass es funktioniert wenn du einfach nur print schreibst? Hab noch nicht so viel Erfahrung mit Python

Woher ich das weiß:eigene Erfahrung
regex9  08.01.2020, 22:18

Es handelt sich um einen Countdown. Damit sich der Zähler verändert, wird die Schleife benötigt.

0
verreisterNutzer  08.01.2020, 22:21
@regex9

wenn man print("123") schreibt wird nur 123 (also was in der Funktion Print drinsteht) ausgegeben. Deswegen benötigt man die For-Schleife. Aber trotzdem danke :D

0

Gib der Funktion print einfach noch ein Argument für den Parameter end mit, welches bestimmt, was an das Ende der Ausgabe noch angehängt werden soll. Standardmäßig ist das ein Zeilenumbruch.

Also zum Beispiel:

print(str(timer - i), end=' ')

um an das Ende immer ein Leerzeichen zu hängen.

Eine alternative Lösung wäre es, statt sofort Ausgaben zu generieren, erst einen String zusammenzubauen und den später auszugeben:

result = ""

for i in range(timer):
  result += str(timer - i) + " "
  time.sleep(1)

print(result)

PS.: Deine letzte Zeile ist fehlerhaft. Der String muss in Anführungszeichen geschrieben werden.