Ich möchte ein solches Programm erstellen, das Zeichen aus einer Zeichenfolge liest und jedes Zeichen nach einer gewissen Verzögerung druckt, damit es wie ein Tippeffekt aussieht.

Jetzt ist mein Problem, dass die Schlaffunktion nicht richtig funktioniert. Es druckt den ganzen Satz nach langer Verzögerung.

import sys
from time import sleep

words = "This is just a test :P"
for char in words:
    sleep(0.5)
    sys.stdout.write(char)

Ich benutze "sys.stdout.write" zum Entfernen von Leerzeichen zwischen Zeichen.

7
Parth Gajjar 30 Nov. 2013 im 20:01

7 Antworten

Beste Antwort

Sie sollten nach jeder Iteration sys.stdout.flush() verwenden

Das Problem ist, dass stdout mit der Newline oder manuell mit sys.stdout.flush() geleert wird.

Das Ergebnis ist also

import sys
from time import sleep

words = "This is just a test :P"
for char in words:
    sleep(0.5)
    sys.stdout.write(char)
    sys.stdout.flush()

Der Grund, warum Ihre Ausgabe gepuffert wird, besteht darin, dass Systemaufrufe ausgeführt werden müssen, um eine Ausgabe durchzuführen. Systemaufrufe sind teuer und zeitaufwändig (aufgrund des Kontextwechsels usw.). Daher versuchen User Space-Bibliotheken, es zu puffern, und Sie müssen es bei Bedarf manuell leeren.

Nur der Vollständigkeit halber ... Die Fehlerausgabe ist normalerweise nicht gepuffert (das Debuggen wäre schwierig). Das Folgende würde also auch funktionieren. Es ist nur wichtig zu wissen, dass es auf der Fehlerausgabe gedruckt wird.

import sys
from time import sleep

words = "This is just a test :P"
for char in words:
    sleep(0.5)
    sys.stderr.write(char)
5
Jan Vorcak 30 Nov. 2013 im 16:13

Lange Antwort:

import sys
import time

variable_name = 'Words'

for char in variable_name:
    time.sleep(0)
    sys.stdout.write(char)

Warum brauchen Sie die Spülmethode? Mein Code funktioniert ohne.

Kurze Antwort:

import time

variable_name = 'Words'

for char in variable_name:
    time.sleep(0)
    print(char, end = '')

Wenn Sie möchten, dass die Wörter vertikal gedruckt werden, sollten Sie das Endargument weglassen.

Wenn Sie möchten, dass die Wörter horizontal gedruckt werden, sollten Sie das Argument end verwenden.

In beiden Fällen funktioniert der Code ohne die Flush-Methode.

0
MacroGrover 16 Nov. 2018 im 00:54

Sie müssen das stdout an jeder Schleife leeren, um den Puffer zu leeren:

import sys

from time import sleep

words = "This is just a test :P\n"
for char in words:
    sleep(0.5)
    sys.stdout.write(char)
    sys.stdout.flush()

Ohne dies speichert es einfach Ihre Zeichenfolge im Puffer und wartet auf ein \n (oder eine ausreichende Anzahl von Zeichen zum Drucken), das am Ende Ihrer Schleife eintrifft.

Mehr Info :

2
Community 23 Mai 2017 im 10:28

Um es einfacher zu machen, sollten Sie eine sys.stdout.flush- und eine def-Funktion einfügen. Beispielsweise:

    import sys
    import time

    def print_slow(str):
        for char in str:
            time.sleep(.1)
            sys.stdout.write(char)
            sys.stdout.flush()

print_slow('Hello')

Das sollte funktionieren, weil ich es getestet habe. Das Def macht es einfacher, Ihre Zeichenfolgen zu schreiben, und Sie können es beliebig anpassen. (:

0
liil 28 Jän. 2019 im 16:49

In Python 3 können Sie die Aufrufe von sys.stdout durch Standardaufrufe von print ersetzen:

for char in words:
    sleep(0.1)
    print(char, end='', flush=True)
1
Reblochon Masque 3 Okt. 2017 im 03:16
import sys
from time import sleep

words = "Welcome to CB#SA.NET.CO"
for char in words:
sleep(0.1)
sys.stdout.write(char)
sys.stdout.flush()
0
Robert 2 März 2016 im 09:24

Ich habe eine ähnliche Antwort auf @Jon Vorcak,

Wir verwenden eine Funktion mit seinem Code

#you can also call it whatever you want
def type(text):
  words = text
  for char in words:
    time.sleep(0.2)
    sys.stdout.write(char)
    sys.stdout.flush()
type("hi")
0
user12327406user12327406 2 Dez. 2019 im 23:07