Seite 1 von 1

.after() und Hilfe

Verfasst: Freitag 7. Dezember 2018, 12:49
von Ebbi
Hallo nochmal,

ich habe seit meinem letzten Post den Code nochmal überarbeitet und versucht es selber auf die Reihe zu bekommen. Leider verstehe ich nicht, warum mir noch immer Fehler angezeigt werden:

Code: Alles auswählen

from tkinter import *
import time
import serial
import RPi.GPIO as GPIO

ser = serial.Serial(
    port='/dev/ttyAMA0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
    )
counter=0






root = Tk()
root.configure(bg="white")   
root.wm_minsize(width=1024,height=600)
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1) 
frame=Frame(root) 
frame.grid(row=0, column=0, sticky=N+S+E+W)

class Application:
    
    def KachelO(self,a,Platz): 

        label = Label(frame,text=Platz,bg="white",bd=1, relief = SUNKEN) 
        label.grid(row=0, column=a, sticky=N+W+E)  

        Seriennummer = Label(frame,text="Seriennummer:",anchor=W)
        Seriennummer.grid(row=1,column=a,sticky=W+N)

        Belegt=Label(frame,text="Belegt?",font = "bold")
        Belegt.grid(row=3,column=a,sticky=N)

        AntwortaufBelegt=Label(frame,text="JA",bg="green")
        AntwortaufBelegt.grid(row=4,column=a,sticky=N)

        Bereit=Label(frame,text="Einsatzbereit?",font = "bold")
        Bereit.grid(row=6,column=a,sticky=N)

        AntwortaufBereit=Label(frame,text="JA",bg="green")
        AntwortaufBereit.grid(row=7,column=a,sticky=N)

        self.loop()

    def loop(self):
         self.abfrage()
         self.auswertung()
         self.after(100,self.loop)    #Fehler 1


    def abfrage(self):
     self.x=ser.readline()

     if self.x != b' ':
         self.reading = ser.readline().decode()
         if self.reading:
            if self.reading.endswith('\r\n'):
                self.Distanz = float(self.reading.strip())
            else:
                self.Temperatur = float(self.reading)

    def auswertung(self):
     if self.Distanz < 20:
        self.AntwortaufBelegt['text']="JA"   #Fehler 2
     else:
        self.AntwortaufBelegt['text']="NEIN"  

     if self.Temperatur < 25:
        self.Bereit['text']="JA"
     else:
        self.Bereit['text']="NEIN"
      
    

A=Application()

        
for row_index in range(32):
     Grid.rowconfigure(frame, row_index, weight=1)
for col_index in range(4):
     Grid.columnconfigure(frame, col_index, weight=1)or row_index 

     A.KachelO(0,"Platz 1")
     A.KachelO(1,"Platz 2")
     A.KachelO(2,"Platz 3")
     A.KachelO(3,"Platz 4")



     label9=Label(root,text="Anzahle der Endoskope im Schrank:",bg="white",anchor=W, bd=1, relief = SUNKEN)
     label9.grid(row=32,column=0,sticky=E+S+N+W)




root.mainloop()

Warum wird mir die .after() Funktion als Fehler angezeigt?
Warum kann ich in der Funktion Auswertung die Label nicht aufrufen?

Ich brauche keine Musterlösung sondern einen Denkanstoß.... Danke

Re: .after() und Hilfe

Verfasst: Freitag 7. Dezember 2018, 14:21
von Sirius3
Statt nur zu schreiben, dass ein Fehler auftritt solltest Du auch schreiben, welcher Fehler das genau ist.

Sternchenimporte vermeiden, weil man unkontrolliert Namen in den Namensraum lädt. tkinter wird üblicherweise als `import tkinter as tk` importiert und alle Namen per tk.xyz angesprochen.
Zeile 6-27 und alles ab Zeile 93 gehört in eine Funktion, die üblicherweise main genannt wird, dann passiert es auch nicht, dass global Variablen überall verwendet werden, wie z.B. `frame` in KachelO. Klassen sollten immer ein __init__ haben, denn mit uninitialisierten Klassen kann man nichts anfangen.
`x` und `reading` in abfrage haben nichts als Attribute von Application verloren. Das sind eine ganz normale lokale Variable.
`AntwortaufBelegt` ist kein Attribut von Application, ebensowenig `after` und `Bereit`. Was soll die 9 bei `label9` und warum wird 4 mal das gleiche Label erzeugt?
`counter` wird initialisiert aber nicht benutzt.
Zeile 99: was denkst Du bewirkt das `or`?

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 1 oder 5 oder 3.

.

Re: .after() und Hilfe

Verfasst: Montag 10. Dezember 2018, 20:37
von Ebbi
Erstmal Danke für die Hilfe! Ich habe den Code erstmal etwas übersichtlicher gemacht, um es erstmal grundsätzlich zum laufen zu bringen

Code: Alles auswählen

from tkinter import *
import tkinter as tk
import time
import serial
import RPi.GPIO as GPIO



ser = serial.Serial(
    port='/dev/ttyAMA0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
    )

class Application(tk.Tk):

    def __init__(self):
        root=Tk()
        self.label1=Label(root,text="Bereit?",bg="white")
        self.label1.grid(row=0)

        self.label2=Label(root,text="JA",bg="green")
        self.label2.grid(row=1)

        self.label3=Label(root,text="Bereit?",bg="green")
        self.label3.grid(row=4)

        self.label4=Label(root,text="JA",bg="white")
        self.label4.grid(row=5)

        self.Distanz=0
        self.Temperatur=0

        self.loop()

    def loop(self):
        self.abfrage()
        self.auswertung()
        self.root.after(100,self.loop)    


    def abfrage(self):
        x=ser.readline()

        if x != b' ':
            reading = ser.readline().decode()
            if reading:
                if reading.endswith('\r\n'):
                    self.Distanz = float(reading.strip())
                else:
                    self.Temperatur = float(reading)

    def auswertung(self):
        if self.Distanz < 20:
            self.label2['text']="JA"   
        else:
            self.label2['text']="NEIN"  

        if self.Temperatur < 25:
            self.label4['text']="JA"
        else:
            self.label4['text']="NEIN"

def main():

    
    
    Application().mainloop()
    

if __name__ == "__main__":
    main()


Wenn ich den Code auf meinem Py laufen lasse, kommt folgender Fehler: "RecursionError: maximum recursion depth exceeded while calling a Python object

Re: .after() und Hilfe

Verfasst: Montag 10. Dezember 2018, 20:49
von __blackjack__
@Ebbi: Die vollständige Ausnahme wäre nett, nicht nur eine Zeile davon.

Du hast hier auf jeden Fall das Problem, dass es zwei `Tk`-Exemplare zur gleichen Zeit gibt. Das darf es aber nur einmal geben, denn das ist *das* Hauptfenster, wo auch der ganze Tcl-Interpreter dran hängt.