Python Countdown in einer Zeile ausgeben?
Hey,
Ich würde gerne ein Python - Timer erstellen, der in einer Zeile zählt.
Also nicht:
5
4
3
2
1
sondern die 5 mit der 4 ersetzt, die mit der 3 ersetzt ...
Hoffe ihr versteht was ich meine. Hab auch schon auf YT und co gesucht und nichts zufriedenstellendes gefunden. Könnt ihr es auch evtl. erklären warum man es so macht, damit ich dann was daraus lerne ^^
Mein Aktueller "Timer-Code":
1 import time
2
3 timer = int(input("Zeit eingeben (min)")
4 print("Es werden" + str(timer) + "min gezählt")
5
6 start = int(input("Press 1 to Start"))
7
8 if start == 1:
9
10 for i in range(timer):
11 print(str(timer - i))
12 time.sleep(1)
13 print("Time is Up")
14
15 else:
16 print(Error!)
Wesentlich ist die Zeile 10-13.
Und noch eine Andere Frage: Ist es möglich den Timer 1 während man eine Taste drückt zu stoppen und einen anderen herunterzählen zu lassen? Bzw. hat diesbezüglich jemand Tipps mit welchen Funktionen (?) man da arbeiten kann.
Ich bin noch am lernen, also nicht wundern ^^
Danke für Antworten
4 Antworten
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.
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.
Infos zu den ascii-Steuerzeichen findest du auf https://de.m.wikipedia.org/wiki/Steuerzeichen
In der zweiten Tabelle bei C0-Steuerzeichen
Was Du machen möchtest ist abhängig vom System. Wenn das Terminal ANSI Steuercodes versteht ist das eine einfache Möglichkeit.
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
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.
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
Es handelt sich um einen Countdown. Damit sich der Zähler verändert, wird die Schleife benötigt.
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
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.
Perfekt das hab ich gesucht :D
Was hab ich dem Programm jetzt mit end='\r' genau gesagt?