Seite 1 von 1

Schleife unterbrechen EVENT

Verfasst: Donnerstag 22. Januar 2009, 23:00
von Rootmentor
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

Verfasst: Donnerstag 22. Januar 2009, 23:30
von yipyip
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

Verfasst: Freitag 23. Januar 2009, 22:28
von 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ß

Verfasst: Samstag 24. Januar 2009, 05:52
von numerix
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()

Verfasst: Samstag 24. Januar 2009, 10:29
von wuf
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:

Verfasst: Samstag 24. Januar 2009, 11:32
von numerix
@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.