AttributeError: 'NoneType' object has no attribute 'set'
Verfasst: Mittwoch 6. November 2019, 19:15
Hey Freunde,
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:
Ich habe natürlich schon sehr lange gegoogled. Häufig wird gesagt, dass die Grid-Methode den Rückgabewert None hat. Meiner Meinung nach definiere ich die Variabel aber korrekt.
Hier der Teil meines Codes.
Habt ihr eine Idee? Und sorry für die "Namenswahl". Ich habe die Variabeln noch nicht vernünftig geändert.
Vielen Dank!
Mfg
Nick
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