Hi!
Ich stelle es hier rein, damit es nicht verloren geht.
Dieses Beispiel demonstriert wie man ein Schleife in einem Thread mit Hilfe eines Event-Objekts anhält und wieder startet.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""
Threading mit Event - Beispiel
"""
import threading
import time
import Tkinter
import sys
class Motorsteuerung(threading.Thread):
"""
Simulierte Schrittmotorsteuerung
"""
def __init__(self, motormeldungen = None):
"""
schalter = threading.Event
motormeldungen = Rückgabe als Tkinter.StringVar, damit eine
Meldung in einem Label angezeigt werden kann.
"""
threading.Thread.__init__(self)
self.schalter = threading.Event()
self.motormeldungen = motormeldungen
self.canceled = False
def run(self):
"""
Der Motor wird initialisiert.
Enthaelt die Steuerschleife.
"""
i = 0
while True:
# Hier wird darauf gewartet, dass der Schalter
# eingeschaltet wird.
self.schalter.wait()
if self.canceled:
break
# Statt einer Schrittmotor-Aansteuerung wird hier einfach
# ein Text an die Variable "motormeldungen" uebergeben.
# Statt mit einer Tkinter.StringVar könnte man natürlich
# auch mit print etwas anzeigen lassen.
i += 1
if self.motormeldungen:
self.motormeldungen.set("Motor laeuft (%s)" % i)
else:
print "Motor laeuft (%s)" % i
time.sleep(0.5)
def motor_start(self):
"""
Schaltet den Motor ein
"""
self.schalter.set()
def motor_stopp(self):
"""
Stoppt den Motor aus
"""
self.schalter.clear()
def motor_aus(self):
"""
Schaltet den Motor aus
"""
self.canceled = True
self.schalter.set()
class MeinFenster(Tkinter.Tk):
"""
GUI
"""
def _center(self, *args):
"""
Zentriert das Fenster
"""
xpos = (self.winfo_screenwidth() - self.winfo_width()) / 2
ypos = ((self.winfo_screenheight() - self.winfo_height()) / 2) / 100 * 90
self.wm_geometry("+%d+%d" % (xpos,ypos))
def motor_aus(self):
"""
Schaltet die Schleife aus und schliesst das Fenster
"""
self.motor.motor_aus()
self.destroy()
def __init__(self):
"""
Anzeigen und initialisieren
"""
# Init
Tkinter.Tk.__init__(self)
self.motormeldungen = Tkinter.StringVar()
# Motor initialisieren
self.motor = Motorsteuerung(self.motormeldungen)
self.motor.start()
# Fenster und Buttons
self.config(bd = 10)
frame = Tkinter.Frame(self)
frame.pack()
Tkinter.Button(
frame,
text = "Start",
command = self.motor.motor_start,
bd = 10, padx = 10, pady = 10
).grid(row = 0, column = 0)
Tkinter.Button(
frame,
text = "Stopp",
command = self.motor.motor_stopp,
bd = 10, padx = 10, pady = 10
).grid(row = 0, column = 1)
# Label
lab = Tkinter.Label(
self,
text = "",
textvariable = self.motormeldungen,
bd = 10, padx = 10, pady = 10
).pack()
# Aus
Tkinter.Button(
self,
text = "Motor AUS",
command = self.motor_aus,
bd = 4
).pack()
# Warten bis das Fenster angezeigt wird und dann zentrieren
self.wait_visibility()
self._center()
if __name__ == "__main__":
fenster = MeinFenster()
Tkinter.mainloop()
sys.exit(0)
mfg
Gerold

Edit: Optik des Codes verbessert