Timer in einer Schleife

  • Hallo Kai,

    Du hast natürlich recht das ich diese Funktion an dieser Stelle nicht benötige. Wollte mir aber an einer anderen Stelle sicher sein

    das die Daten wirklich ausgegeben werden. Muss man wohl mit Leben.

    Egal weiter gehts. Heute ist bei uns ein wunderschöner Regentag. Da kann ich mich vor jeglicher Gartenarbeit drücken und einfach mit Python

    weitermachen:saint:.


    Gruss Frank.

  • Wahrscheinlich ist das auch wieder so eine Feinheit, die zwar zu Python gehört aber in Micropython nicht implementiert ist. Ich habe jedenfalls keine bessere Erklärung dafür. Bestimmt ist es gar nicht notwendig, diese Option hier zu verwenden. Also lass sie einfach weg ;).


    Gruß Kai

  • Hallo Kai,

    versuche nun das Erlernte zu kombinieren.

    Verstehe aber im Moment folgendes überhaupt nicht:


    Code
    1. if taster1.value()==True:
    2. rechteckflaeche=rechteck(2.0,3.0)
    3. print ("Die Fläche ist = ",rechteckflaeche[0],end=" ")
    4. print ("Der Umfang ist = ",rechteckflaeche[1],flush=True)

    sobald ich das flush=True anfüge meldet Thonny :


    Die Fläche ist = 6.0 Traceback (most recent call last):

    File "<stdin>", line 34, in <module>

    TypeError: extra keyword arguments given


    In Visual Studio Code funktioniert das ohne Probleme.


    Gruss Frank.

  • Der Grund ist die Implementierung des Print Befehls. Es gibt bei Betriebssystemen im Allgemeinen drei standardmäßige Datenströme (streams): stdin (Standardinput), stdout(Standardoutput) und stderr (Standarderror).


    Diese Datenströme (zumindest stdout) können an unterschiedliche (Ein-)/Ausgabegeräte geleitet werden. Z.b. zu einem Bildschirm, einem Drucker, eine Datei usw..

    Weil diese Geräte unterschiedliche "Ausgabegeschwindigkeiten" haben, werden Datenströme üblicherweise gepuffert, damit das Betriebssystem Ausgabeprozesse schneller abarbeiten kann und nicht warten muss, bis das Endgerät mit der Ausgabe fertig ist. Das ist jetzt etwas Laienhaft ausgedrückt, aber ich bin auch kein Betriebssystementwickler ;).


    Stdout ist standardmäßig gepuffert bis ein "\n" (Zeilenende) kommt. Das ist aber bei Deinem Beispiel mit end=" " ausgeschaltet. Wenn Du das weglässt, dann brauchst Du auch den flush=True Ausdruck nicht mehr. Das hängt also zusammen.


    Man kann bei der Pythonkonsole das Pufferverhalten durch Startparameter und/oder durch eine Umgebungsvariable beeinflussen.


    py --help gibt unter anderem folgendes aus:

    Zitat

    -u : force the stdout and stderr streams to be unbuffered;

    this option has no effect on stdin; also PYTHONUNBUFFERED=x


    Gruß Kai

  • Hallo Kai,

    kann keine schlüssige Antwort auf die Frage finden warum der PRINT Befehl dieses flush=true benötigt.

    Gibt es praktische Gründe um die Bildschirmausgabe mit print zu puffern ?

    Habe aber grundsätzlich verstanden was da passiert also alles wieder gut.


    Gruss Frank.

  • flush_erklärung.PNG<= Da wäre ich nie drauf gekommen

    Vielen Dank Kai !!!

    War kurz vorm aufgeben.

    Im Visual Studio Code hat es funktioniert mit " Ohne Debuggen ausführen " und nicht beim ausführen " Python Datei im Terminal ausführen "

    Im cmd hat es mal und mal nicht funktioniert genau das gleiche bei Thonny. Da klingt Deine Erklärung sehr plausibel.

    Das hat mich echt verzweifeln lassen.

    Im richtigen Leben programmiere ich mit echt zeit systemen ( SPS Programmierung ) daher sind mir solche Phänomene nicht bekannt.

    Werde mich aber weiter mit Python beschäftigen und am Ball bleiben.

    Nochmal DANKE !!!


    Ganz vergessen zu sagen das es nun funktioniert.

  • Das liegt daran, dass die Ausgabe gepuffert und deshalb die "Zwischenschritte" nicht ausgegeben werden.


    Code
    1. import time
    2. eingabe = int(input("Startwert = "))
    3. while eingabe != 20:
    4.         eingabe = eingabe + 1
    5.         print (eingabe,end=" ",flush=True)
    6.         time.sleep(1)
    7. print ()
    8. print ("FERTIG gerechnet")


    Das flush=True sollte Abhilfe schaffen.

  • Sehr merkwürdig. Nach Rechnerneustart macht das Prg. was es soll und was erwartet wurde.

    Habe leider keine Erklärung.



    Hallo Rene,

    wenn ich das Prg. in der Python Shell ausführe dann ist die Ausgabe wie erwartet.



    Gruss Frank

  • Hallo Rene,

    bei mir verhält es sich anders.

    Nachdem ich einen Startwert von 5 eingegeben habe passiert erst mal nichts. Nach ca. 16 Sekunden werden die Zahlen 6 bis 20

    auf einmal ausgegeben.

    Dieses Verhalten ist in Thonny, Visual Studio Code und auch in der py.exe gleich.


    Gruss Frank

  • Hallo zusammen,

    nun bin ich bei den Schleifen angelangt und da ergibt sich eine Frage :


    Code
    1. eingabe = int(input("Startwert = "))
    2. while eingabe != 20:
    3. eingabe = eingabe + 1
    4. print (eingabe,end=" ")
    5. print ()
    6. print ("FERTIG gerechnet")

    das Erg. ist wie erwartet bei einer Eingabe von z.B. 4 werden alle ganzen Zahlen bis 20 ausgegeben und die Schleife ist beendet.


    Hier nun meine Frage : Das Ziel sollte sein, dass jede Sekunde eine Berechnung durchgeführt wird und dann ausgegeben wird.

    Wo ist mein Denkfehler ? Bin davon ausgegangen das die Befehle in der Schleife nacheinander abgearbeitet werden. Nach jeder Zeile wird ein VKE gebildet welches 1 wird und dann wird zur nächsten Zeile übergegangen. Das scheint nicht so zu sein da die Zeit schon richtig gebildet wird es kommt nur nicht zum print bzw. es kommt nur einmal zum print.

    Über eine Erklärung würde ich mich freuen. Das das ganze sicherlich anders zu machen ist, ist mir klar nur ich möchte es halt wirklich verstehen.


    Bis dahin,


    Frank.