Kurze Pause

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
Benutzeravatar
Kebap
User
Beiträge: 801
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Früher hab ich am C64 im Supermarkt immer aus Spaß einen kurzen Zweizeiler programmiert, der dann da lustige Labyrinthe auf die Bildschirme zauberte.

Wenn ich das in Python probiere, scrollt das viel zu schnell durch. Wie kann ich eine kurze Pause in die Schleife einbauen? Möglichst Hardware-agnostisch?

Also die erste Idee wäre einfach eine sinnlose Schleife hochzählen lassen, aber deren Dauer ist ja vorher gar nicht so einfach zu bemessen.

Code: Alles auswählen

import random
while True: 
  print(random.choice("/\\"), end="")
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
Kebap
User
Beiträge: 801
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ah, ich gebe mir einfach mal selbst die Antwort: Es gibt dafür time.sleep()

Code: Alles auswählen

import random
from time import sleep
while True: 
  print(random.choice("/\\"), end="")
  sleep(0.05)
OK, jetzt pausiert aber die komplette Ausgabe. Sprich, man sieht das Labyrinth erst nach Keyboard Interrupt und nicht sofort Zeichen für Zeichen aufbauen.

Warum? Wie kann ich das heilen?

Nächste Frage: Wieso kann ich Befehle nicht mehr in eine Zeile quetschen? Früher ging das doch mit Doppelpunkt? Jetzt funken Annotationen dazwischen.

Code: Alles auswählen

    while True: print(random.choice("/\\"), end="") : sleep(0.05)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: illegal target for annotation
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
noisefloor
User
Beiträge: 4327
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zum letzten Punkt: der 2. Doppelpunkt im Einzeiler ist syntaktisch falsch bzw. da kommt der Fehler her. Schon immer, dass kann so auch früher nicht funktioniert haben. Da muss wenn ein ; hin.

Gruß, noisefloor
imonbln
User
Beiträge: 213
Registriert: Freitag 3. Dezember 2021, 17:07

Du musst statt des zweiten Doppelpunkts ein Semikolon verwenden. Zudem kennt print den Parameter flush, mit dem du dafür sorgst, dass stdout sofort dargestellt wird.

Code: Alles auswählen

while True: print(random.choice("/\\"), end='',flush=True); time.sleep(0.05)
Benutzeravatar
Kebap
User
Beiträge: 801
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ihr habt Recht. Der Doppelpunkt stammt wohl noch aus BASIC. :mrgreen: Danke auch für den Hinweis auf Flush.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 14410
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kebap: Das Programm was Du wahrscheinlich meinst ist dieser Klassiker, zu dem es auch ein Buch gibt, das _das_ als Titel hat:

Code: Alles auswählen

10 PRINT CHR$(205.5+RND(1));:GOTO 10
Und / und \ sind da nur ein schlechter Ersatz für die Grafikzeichen im PETSCII-Zeichensatz. Das kann man heute ziemlich Originalgetreu mit Unicode-Zeichen nachstellen. Die beiden diagonalen Linien liegen als Codepoint nämlich auch genau nebeneinander, so dass man den gleichen ”Trick” im Code verwenden kann mit 9585 statt mit 205:

Code: Alles auswählen

import random, time
while True: print(chr(int(9585.5 + random.random())), end="", flush=True); time.sleep(0.02)
“The city's central computer told you? R2D2, you know better than to trust a strange computer!” — C3PO
Antworten