Schleife unterbrechen EVENT

Fragen zu Tkinter.
Antworten
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

Kann ich durch ein Tkinter Event beispielsweise Enter drücken ,
In einer While schleife die sich in einer Funktion befindet "break" auslösen?

Gruß Rootmentor

______________edit_____________
Ich werde mein Problem mit Multithreading lösen

GELÖST
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Es gibt auch noch die after() Methode.
Im Thread

Button event auslösen solange linke Maustaste gedrückt ist
(weiter unten)

sollte eigentlich etwas Passendes für Dich dabei sein.

:wink:
yipyip
abgdf

Kann ich durch ein Tkinter Event beispielsweise Enter drücken, in einer While-Schleife die sich in einer Funktion befindet "break" auslösen?
Ich glaube nicht, daß das guter Code wird. Verändere durch das Enter-Drücken lieber eine Variable und laß' das Programm auf diese Veränderung reagieren.

Gruß
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

abgdf hat geschrieben:
Kann ich durch ein Tkinter Event beispielsweise Enter drücken, in einer While-Schleife die sich in einer Funktion befindet "break" auslösen?
Ich glaube nicht, daß das guter Code wird. Verändere durch das Enter-Drücken lieber eine Variable und laß' das Programm auf diese Veränderung reagieren.
Wobei - und das betrifft nicht nur deinen Vorschlag, dem ich grundsätzlich zustimmen würde - das ganze ohne weiteres ja nicht funktioniert, weil das Programm in der Schleife auf das Event gar nicht reagiert. Es sei denn man ruft in der Schleife update() auf ...

Code: Alles auswählen

import tkinter as tk
from random import random

class Test(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.bind("<Return>", self.start)
        self.bind("<Escape>", self.stop)
        self.loop = True
        self.mainloop()

    def start(self, e):
        print("Start")
        while self.loop:
            a = random()
            self.update() # ohne das geht es nicht!

    def stop(self, e):
        print("Stop")
        self.loop = False

Test()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Ich habe in der Tkinter-Referenz von John W.Shipman (NMT) näheres über die Tkinterr 'update'-Methode gelsen. Er schreibt folgendes:

Code: Alles auswählen

w.update()
   This method forces the updating of the display. It should be used only if you know what you're
   doing, since it can lead to unpredictable behavior or looping. It should never be called from an event
   callback or a function that is called from an event callback.
Ich weiss nicht ob das was er sagt auch wirklich bei jedem Betriebsystem zutrifft. Also dein Vorschlag funktioniert bei mir einwandfrei.

Ich habe hier noch ein Snippet zusammengestellt, welches nur die von 'yipyip' erwähnte Tkinter 'after()' Methode verwendet:

Code: Alles auswählen

# Python 3.0

import tkinter as tk
from random import random

class Test(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.bind("<Return>", self.start)
        self.bind("<Escape>", self.stop)
        self.after_object = None
        self.mainloop()

    def start(self, e):
        print("Start")
        self.after_loop()

    def stop(self, e):
        print("Stop")
        self.after_cancel(self.after_object)

    def after_loop(self):
        value = random()
        print(value)
        self.after_object = self.after(500, self.after_loop)

Test()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@wuf: Danke für deine wertvolle Ergänzung. Mein Beitrag sollte auch nicht zeigen, wie man es machen *sollte*, aber so hätte man das verstehen können. Inwieweit Shipman hier recht hat, weiß ich nicht. Auf jeden Fall ist der Weg über die after()-Methode auch aus meiner Sicht der zu bevorzugende.

Gegenüber der Schleifenvariante mit update() muss man gedanklich eben ein bisschen anders herangehen und am Anfang ist das schon gewöhnungsbedürftig.
Antworten