.after() und Hilfe

Fragen zu Tkinter.
Antworten
Ebbi
User
Beiträge: 3
Registriert: Dienstag 4. Dezember 2018, 11:48

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.

.
Ebbi
User
Beiträge: 3
Registriert: Dienstag 4. Dezember 2018, 11:48

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
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten