mein Vorhaben ist es, 4 Sensorwerte zu simulieren und diese nacheinander "aktivieren" zu können und in 4 Labels die Werte darzustellen und jede Sekunde zu aktualisieren.
Mein Code orientiert sich an diesem Beispiel viewtopic.php?t=3869 . Beim ersten Label und beim ersten Sensor funktioniert das auch. Beim zweiten-dritten-vierten kriege ich immer folgende Fehlermeldung:
Code: Alles auswählen
Exception in thread Thread-50:
Traceback (most recent call last):
File "D:\Anaconda\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:/Users/xx/Desktop/Tkinter/xx.py", line 70, in run
self.motormeldungen1.set(value)
AttributeError: 'NoneType' object has no attribute 'set'
An exception has occurred, use %tb to see the full traceback.
Hier der Teil meines Codes.
Code: Alles auswählen
Threading mit Event - Beispiel
"""
import threading
import time
import tkinter
import sys
import random
class Motorsteuerung(threading.Thread):
"""
Simulierte Schrittmotorsteuerung
"""
def __init__(self, motormeldungen1 = None, motormeldungen2 = None, motormeldungen3 = None, motormeldungen4 = None):
"""
schalter = threading.Event
motormeldungen = Rückgabe als tkinter.StringVar, damit eine
Meldung in einem Label angezeigt werden kann.
"""
threading.Thread.__init__(self)
self.schalter1 = threading.Event()
self.motormeldungen1 = motormeldungen1
self.motormeldungen2 = motormeldungen2
self.motormeldungen3 = motormeldungen3
self.motormeldungen4 = motormeldungen4
self.canceled1 = 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.schalter1.wait()
if self.canceled1:
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 sensor1 == True:
value = random.random() * (35-10) + 10
self.motormeldungen1.set(value)
print("S1")
print (value)
if sensor2 == True:
value1 = random.random() * (35-10) + 10
self.motormeldungen2.set(value1)
print("S2")
print (value1)
if sensor3 == True:
value2 = random.random() * (35-10) + 10
self.motormeldungen3.set(value2)
print("S3")
print (value2)
if sensor4 == True:
value3 = random.random() * (35-10) + 10
self.motormeldungen4.set(value3)
print("S4")
print (value3)
# else:
# print(random.random() * (35-10) + 10 )
time.sleep(1)
def s1_start(self):
"""
Schaltet den Motor ein
"""
self.schalter1.set()
global sensor1
sensor1 = True
def s2_start(self):
"""
Schaltet den Motor ein
"""
self.schalter1.set()
global sensor2
sensor2 = True
def s3_start(self):
"""
Schaltet den Motor ein
"""
self.schalter1.set()
global sensor3
sensor3 = True
def s4_start(self):
"""
Schaltet den Motor ein
"""
self.schalter1.set()
global sensor4
sensor4 = True
def motor_stopp(self):
"""
Stoppt den Motor aus
"""
global sensor1
global sensor2
global sensor3
global sensor4
sensor1 = False
sensor2 = False
sensor3 = False
sensor4 = False
self.schalter1.clear()
def motor_aus(self):
"""
Schaltet den Motor aus
"""
self.canceled1 = True
self.schalter1.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.motormeldungen1 = tkinter.StringVar()
self.motormeldungen2 = tkinter.StringVar()
self.motormeldungen3 = tkinter.StringVar()
self.motormeldungen4 = tkinter.StringVar()
# Motor initialisieren
self.motor = Motorsteuerung(self.motormeldungen1)
self.motor1 = Motorsteuerung(self.motormeldungen2)
self.motor2 = Motorsteuerung(self.motormeldungen3)
self.motor3 = Motorsteuerung(self.motormeldungen4)
self.motor.start()
self.motor1.start()
self.motor2.start()
self.motor3.start()
# Fenster und Buttons
self.config(bd = 10)
frame = tkinter.Frame(self)
frame.pack()
tkinter.Button(
frame,
text = "Start Sensor 1",
command = self.motor.s1_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 = 4, column = 0)
tkinter.Button(
frame,
text = "Start Sensor 2",
command = self.motor.s2_start,
bd = 10, padx = 10, pady = 10
).grid(row = 1, column = 0)
tkinter.Button(
frame,
text = "Start Sensor 3",
command = self.motor.s3_start,
bd = 10, padx = 10, pady = 10
).grid(row = 2, column = 0)
tkinter.Button(
frame,
text = "Start Sensor 4",
command = self.motor.s4_start,
bd = 10, padx = 10, pady = 10
).grid(row = 3, column = 0)
# Label
lab = tkinter.Label(
self,
text = "Fill1",
textvariable = self.motormeldungen1,
bd = 10, padx = 10, pady = 10
).pack()
lab2 = tkinter.Label(
self,
text = "Fill2",
textvariable = self.motormeldungen2,
bd = 10, padx = 10, pady = 10
).pack()
lab3 = tkinter.Label(
self,
text = "Fill3",
textvariable = self.motormeldungen3,
bd = 10, padx = 10, pady = 10
).pack()
# Aus
lab4 = tkinter.Label(
self,
text = "Fill4",
textvariable = self.motormeldungen4,
bd = 10, padx = 10, pady = 10
).pack()
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)
Vielen Dank!
Mfg
Nick