Schleife in TKINTER

  • Hallo,

    warum funktioniert (m)eine Schleife mit label nicht? Soll eine Simulation einer blinkenden LED sein. Ich hab den Eindruck, ich hab die Logik dieser Tkinter Konstruktionen noch nicht begriffen, würde es aber gerne tun.

    Es wird nur "weiß" angezeigt, obwohl doch abwechselnd "rot" und "weiß" dem bg zugewiesen werden müsste. Der Zähler i läuft hoch richtigerweise.

    Gruß

    Rainer

  • Hallo,

    grundsätzlich: Schleifen in einer GUI nie verwenden. Grund: die Schleife blockiert den Mainloop des GUI-Frameworks, der Mainloop muss aber die Kotrolle haben, damit die GUI bedienbar ist.

    Weiterhin: außer bei mega-trivialien GUIs _immer_ die GUI in eine Klasse packen. Alles andere führt nur zu nicht-wartbarem und unübersichtlichen Code.

    Und keine *-Importe, weil das den globalen Namensraum zumüllt. Besser: `import tkinter as tk`und dann alle Tkinter-Elemente an den tk Namensraum binden.

    Gruß, noisefloor

  • noisefloor

    du meinst wohl eher time.sleep und/oder while-True Schleife. Ich habe hier Programme mit dutzende for Schleifen. Ohne for Schleife gäbe es da keine Logik. Aber auch eine for Schleife kann erkennbar blockieren, wenn das Iterieren (zB Textdatei mit mehreren 10k Zeilen) lange dauert.

    rho

    das Zauberwort in tkinker heisst ``after``.

    http://effbot.org/tkinterbook/widget.htm

    Hier mal ein Minimalbeispiel ohne Button. Darauf kannst du aber aufbauen mit der Zeit (nachdem du das, was noisefloor geschrieben hat, verstanden hast)

    Edit: Siehe oben

  • Hallo,

    ich hab das Beispiel oben versucht, ein bißchen aufzublähen, um eine Simulation der Schaltung einer LED zu bekommen. Syntaxfehler gibt es nicht, aber es funktioniert auch nicht. Das Feld sollte nach Tastendruck abwechselnd rot und weiß zeigen. Wo habe ich da einen Denkfehler? Falls sich jemand die Mühe macht, das durczulesen, schonmal tiefen Dank.

    Gruß

  • Leicht abgeändert aus der verlinkten Doku von oben:

  • Hallo,

    das ist natürlich eine schöne Komplettlösung, aber ich versteh damit nicht, warum meins nicht geht.

    In Deinem Script weiter vorne steht die Aktion des Programms in den Zeilen 19 - 21. Diese läuft automatisch ab. Ich wollte diese Automatik durch eine Benutzersteuerung ersetzen an genau dieser Stelle. Da der Random Befehl

    Code
    bg_color = random.choice(colors)

    nicht Bestandteil der Klasse ist (ist doch richtig, oder?), habe ich mir gedacht, dass die Benutzersteuerung da auch nicht rein muss. Wie gesagt, ich versuche zu begreifen und damit bin ich noch nicht fertig, denn ich weiß immer noch nicht, warum es nicht geht.

    Gruß

    Rainer

  • Hallo,

    rho : zu dem Zeitpunkt, wo du versuchst, eine Methode der Instanz der Klasse aufzurufen, läuft die GUI noch nicht, weil der Mainloop nicht gestartet ist.

    Aber, wie gesagt, so wie du das machst, macht man das so wie so nicht, weil schlechter Still. Die Klasse ist dazu da, alle Funktionalitäten zu kapseln. Ein Teil in der Klasse und ein Teil außerhalb mag irgendwie funktionieren, hat aber außer Durcheinander keinen Mehrwert.

    Zitat

    In Deinem Script weiter vorne steht die Aktion des Programms in den Zeilen 19 - 21. Diese läuft automatisch ab. Ich wollte diese Automatik durch eine Benutzersteuerung ersetzen an genau dieser Stelle.

    Verstehe ich nicht. Das Sktript von bootsmann macht genau das, was du auch versucht hast: nach Druck auf die Schaltfläche die Farbe wechseln.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!