Probleme mit Frames und StringVar

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Johnson81
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 07:11

Hallo,

ich habe mich, nachdem ich schon seit Wochen mitlese mich angemeldet, weil ich einfach seit Tagen nicht weiterkomme. Ich hab zwar vor ein paar Wochen nicht gedacht mich überhaupt so weit in Python reinzuarbeiten, aber jetzt kann ich das Problem echt nicht lösen. Ich hoffe jemand hilft mir bei dieser lappalie.
Der Code ist noch nicht ganz fertig aber meine Textvariablen in Tkinter werden einfach nicht angezeigt. Bevor ich angefangen habe mit den Klassen funktionierten dieDoubleVar und StringVar sehr gut. Aber nun geht gar nichts mehr. Ich muss auch zugeben das ich die Frames und Init Klasse nicht ganz verstanden habe. Die Probleme fangen in Zeile 256 an.
Vielen Dank schonmal für die Hilfe.

Hier der Code.

Code: Alles auswählen

import tkinter as tk
import time
from tkinter import filedialog
from tkinter import ttk
from tkinter import messagebox
from tkinter import Frame
from tkinter import Text
from tkinter import Label
import RPi.GPIO as GPIO          
# import glob
from tkinter import StringVar
GPIO.setwarnings(False)           

GPIO.setmode (GPIO.BCM)         

GPIO.setup(13,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.output(13, GPIO.LOW)

class Programm(Frame):

    count = 0
    
    temperature = 0
    temp_c = 0
    counter_ruehren = 0
    p = GPIO.PWM(19,100)
    temperatur = 0
    aufheizen_id = 0
    temp_id = 0
    temp = 0
    arbeitsschritt = ("leerlauf")
    ruehrt = False
    schritteins = False
    schrittzwei = False
    heizunglaeuft = False
    
    
    
    
    #Werte
    
    aufheizen_down =  float(73) 
    maltoserast_up =  float(68)#40-50 Minuten
    maltoserast_down =  float(66)
    amalyserast_up =  float(73) #10-20 Minuten
    amalyserast_down =  float("71")
    
    
        
    def vorgang(self):
        app.arbeitsschritt = tk.StringVar() 
        app.arbeitsschritt.set("Vorgang auswählen")
        
    def aktuelleTemperatur(self):
    
    # 1-wire Slave Datei lesen
        file = open('/sys/bus/w1/devices/28-0300a279c08b/w1_slave')
        self.filecontent = file.read()
        file.close()
        
        # Temperaturwerte auslesen und konvertieren
        self.stringvalue = self.filecontent.split("\n")[1].split(" ")[9]
        self.temp_c = float(self.stringvalue[2:]) / 1000
        app.temp = tk.DoubleVar()
        self.temp.set(self.temp_c)
        print (self.temp.get())
        self.temp_id = self.after(5000, self.aktuelleTemperatur)
        
    
    
    def temperatur_holen(self):
        self.aktuelleTemperatur()
          
    def schritteins_start(self):
        
        if self.schritteins == False:
            self.arbeitsschritt = tk.StringVar()
            self.arbeitsschritt.set("Aufheizen")
            print(arbeitsschritt.get)
            self.aufheizen()
        else:
            if messagebox.showinfo("Hinweis", "Anderer Prozess aktiv!"):
                pass
            
    def schrittzwei_start(self):
        if self.schrittzwei == False:
            self.schrittzwei = True
            self.arbeitsschritt.set("Maltoserast")
            self.maltoserast()
        else:
            if messagebox.showinfo("Hinweis", "Prozess aktiv!"):
                pass
    
    def stopper(self):
        #self.arbeitsschritt.set("Stop")
        GPIO.output(13, GPIO.LOW)
        print("Heizung aus")
        if self.schritteins == True:
            self.after_cancel(self.aufheizen_id)
            self.schritteins = False
        if self.schrittzwei == True:
            self.after_cancel(self.maltoserast_id)
            self.schrittzwei = False
                    
    def stopbuttonclick(self):
        self.stopper()
                
                
    
    def aufheizen(self):        
        
        #print("Programm Aufheizen")
        if self.temp_c < self.aufheizen_down:
            print(self.temp.get())
            Proigramm.arbeitsschritt = tk.StringVar()
            Programm.arbeitsschritt.set("aufheizen")
            self.schritteins = True
            GPIO.output(13, GPIO.HIGH)
            self.heizung_lauft = True
            self.aufheizen_id = self.after(9000, self.aufheizen)
            print("Heizung ein")
            
                
        if self.temp_c > self.aufheizen_down:
            GPIO.output(13, GPIO.LOW)
            self.heizung_lauft = False
            print("Temperatur erreicht")
            
            if messagebox.showinfo("Hinweis", "Wasser ist aufgeheizt, Malz hinzugeben! Wenn es weitergeht OK drücken und auf Einmaischen gehen"):
                
                self.stopper()
                    
    
     
    def maltoserast(self):
        
        
        self.count = self.count +1
        if count == 1200 or count == 2400 or count == 3300:
            ruhren_lang()
            print("rührt")
            print(count)
            
        if temp_status < maltoserast_down: #and arbeitsschritt_fertig == 1:
            GPIO.output(13, GPIO.HIGH)
            Maltoserast_id = root.after(1000, maltose_rast)
            print("heizt Maltose")
            
        if temp_status > maltoserast_up:
            GPIO.output(13, GPIO.LOW)     
            Maltoserast_id = root.after(1000, maltose_rast)
            print("Heizung aus")
             
        if count == 3600:
            GPIO.output(13, GPIO.LOW)
            if messagebox.showinfo("Hinweis", "Verzuckerungsrast abgeschlossen"):
                count = 0
                arbeitsschritt_fertig = arbeitsschritt_fertig +1
                #root.after_cancel(maltoserast_ende)
                amalyse_rast()
                stopper()

    def amalyse_rast(self):
        
        self.count = self.count +1
        print(count)
        temp_status = temp.get()
        
        if count == 600 or count == 1000:
            ruehren_lang()
            print("rührt")
            
        if temp_status < amalyserast_down: #and arbeitsschritt_fertig == 2:
            GPIO.output(13, GPIO.HIGH)
            amalyserast_id = root.after(1000, amalyse_rast)
            print("heizen")
            
        if temp_status > amalyserast_up: # and arbeitsschritt_fertig == 2:
            GPIO.output(13, GPIO.LOW)
            amalyserast_id = root.after(1000, amalyse_rast)
            print("Heizung aus")
                
            
        if count == 1200:     
            if messagebox.showinfo("Hinweis", "Amalyse abgeschlossen"):
                count = 0
                arbeitsschritt_fertig = arbeitsschritt_fertig +1
                #root.after_cancel(amalyserast_ende)
                return
                print(arbeitsschritt_fertig)

    def ruehren_ein(self):   
        
        if self.ruehrt == False:
            self.ruehrt == True
            self.p.start(100)
                    
    
    def ruehren_aus(self):
        
        #if self.ruehrt == True:
        self.p.stop()
        self.ruehrt == False
    
    def ruehren_lang(self):
    
        
        if self.ruehrt == False:
            self.ruehrt == True
            self.p.start(100)
            self.after(200000, self.ruehren_aus)
    
    def heizung(self):
        if self.heizunglaeuft == False:
            GPIO.output(13, GPIO.HIGH)
            self.heizunglaeuft == True
            
    def heizung_aus(self):
        #if self.heizunglaeuft == True:
        GPIO.output(13, GPIO.LOW)
        self.heizunglaeuft == False
            
    def reset(self):
        pass
        
    def buttonBeendenClick(self):
        if messagebox.askyesno('Beenden', 'Soll das Programm wirklich beendet werden?'):
            self.stopper()
            GPIO.cleanup()
                
            self.quit()
            
            mainWin.destroy()
                
    def __init__(self, parent=None):
        tk.Frame.__init__(self, parent)
        tk.Frame.pack(self)
        self.gui()
        
    def gui(self):        
                
        self.lbl_free = (tk.Label (self, text = "-----"))
        self.lbl_free2 = (tk.Label (self, text = "-----"))
        self.start = (tk.Button (self, height = 5, width = 50, text = "Aufheizen", command = lambda: self.schritteins_start()))
        self.stop = (tk.Button (self, height = 2, width = 50, text = "Stop", command = lambda: self.stopbuttonclick()))
        self.ruhren = (tk.Button (self, text = "Rühren Ein", height = 2, width = 50,command = lambda: self.ruehren_ein()))
        self.ruhren_aus = (tk.Button (self, text = "Rühren Aus", height = 2, width = 50,command = lambda: self.ruehren_aus()))
        self.heizen = (tk.Button (self, text = "Heizen Ein", height = 2, width = 50,command = lambda: self.heizung()))
        self.heizen_aus = (tk.Button (self, text = "Heizen Aus", height = 2, width = 50,command = lambda: self.heizung_aus()))
        self.einmaischen = (tk.Button (self, text = "Einmaischen", height = 5, width = 50, command = lambda: self.schrittzwei_start()))
        self.zurucksetzen = (tk.Button (self, text = "Zurücksetzen", height = 2, width = 50, command = lambda: self.reset()))
        self.Beenden = (tk.Button (self, text = "Beenden", height = 2, width = 50, command = lambda: self.buttonBeendenClick()))
        self.aktuell_temp_lbl = (tk.Label (Frame, textvariable = self.temp))
        self.arbeitsschritt_lbl = (tk.Label (self, textvariable = self.arbeitsschritt))
         
        
        
        self.lbl_free.grid(row = 16, column =0)
        self.start.grid(row=7, column=0)
        self.einmaischen.grid(row = 7, column = 1)
        self.stop.grid(row=9, column=0)
        self.ruhren.grid(row=12, column=0)
        self.ruhren_aus.grid(row=12, column=1)
        self.heizen.grid(row=13, column=0)
        self.heizen_aus.grid(row=13, column=1)
        self.lbl_free2.grid(row=11, column=0)
        self.zurucksetzen.grid(row=9, column=1)
        self.Beenden.grid(row=18, column=0)
        self.aktuell_temp_lbl(row=19, column=0)
        self.arbeitsschritt_lbl(row=19, column=0)
        
        

mainWin = tk.Tk()
app = Programm(mainWin)
app.temperatur_holen()
app.vorgang()
mainWin.mainloop()        
 



Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei `import` ist as zum Umbenennen da, GPIO wird aber gar nicht umbenannt, das gehört also weg. Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß man aber verlässlich am Programmende GPIO.cleanup aufrufen, am besten in einem finally-Block.
Auf oberster Ebene sollte kein ausführbarer Code stehen, die GPIO-Initialisierung und die drei letzten Zeilen gehören also auch in eine Funktion, die man üblicherweise `main` nennt.
Klassenattribute sind kein Ersatz für Instanzattribute. Klassenattribute sollten ausschließlich Konstanten sein, und die schreibt man komplett gross.
Instanzattribute werden in __init__ angelegt.
Was sollen die float-Aufrufe in aufheizen_down und folgende? Wenn Du eine Fließkommazahl willst, schreibe die so, 73.0 Warum dann auch noch einer der Werte ein String ist ???
Methoden sollten auch nach Tätigkeiten benannt sein, `vorgang` oder `aktuelleTemperatur` sind keine. Warum besteht `temperatur_holen` nur aus einem Aufruf, oder besser gefragt, warum nennst Du aktuelleTemperatur nicht gleich so?
In aktuelleTemperatur: Dateien öffnet man innerhalb eines with-Statements. filecontent sollte kein Instanzattribut sein, sondern eine lokale Variable. Ebenso stringvalue. Benutze split ohne Argument und die magische 9 sollte wohl ein -1 sein, wenn Du nur das letzte Element willst.
`app` sollte nicht einfach so auftauchen, sondern als Argument übergeben werden. Benutze keine globalen Variablen! Achso, app sollte eigentlich self sein.
Benutze keine Abkürzungen, wenn Du temperature meinst, dann nenn es nicht temp. Warum gibt es das einmal als DoubleVar und einmal als float? Die Zahl sollte nur einmal existieren. Und es sollte auch nicht jedesmal ein neues DoubleVar-Objekt erzeugt werden, sondern das einmal am Anfang erzeugte benutzt werden. Wobei, wo ist denn der Anfang?

Es wird nicht explizit auf True oder False geprüft, bei True ist die Variable eh schon ein Wahrheitswert und da ändert ein == True auch nichts dran und bei False benutzt man not.

Wie da wann geheizt wird, verstehe ich nicht. Es sollte EINE Funktion geben, die die Steuerung übernimmt und regelmäßig aufgerufen wird, nicht 4 Stück.
Statt magischer Pin-Werte (13, 19) benutzt man Konstanten.

Ah, jetzt wird endlich die GUI gebaut. Das gehört alles in __init__ nicht in eine eigene Methode. Frames packen sich nicht selbst, das `pack` gehört ins Hauptprogramm, damit dort entschieden werden kann, ob pack oder grid gebraucht wird.
Die Klammern um die tk.Label sind allesamt überflüssig. Statt lambda gibt man direkt die Methode an.
self.temp und self.arbeitsschritt sind zu diesem Zeitpunkt noch nicht definiert.
Johnson81
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 07:11

Hallo,
danke schonmal für die Tipps und Anregungen. Wie gesagt, dass ich überhaupt so weit gekommen bin ist ein Wunder. Ich versuche die Sachen umzusetzen die Du geschrieben hast um das ganz nochmal auf Vordermann zu bringen. Irgendwann hat man zuviele verschiedene Tutorials gelesen und verliert den Überblick und sieht den ganzen Wald nicht mehr.
Johnson81
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 07:11

Ich habe jetzt noch nicht alles umgesetzt. Aber ich bekomme die GUI nicht mehr hin egal wie ich das pack und frames setze. Ich bin blutiger Anfänger und lese mich quer durch Foren, Bücher und Tutorials. Aber tagelang an einem Problem zu sitzen macht kein Spass.
Aber ich würde wirklich gerne was dazu lernen und weiterkommen. Im Moment fehlt mir aber echt eine transferleistung im Kopf.

Code: Alles auswählen

import tkinter as tk
import time
from tkinter import Frame
from tkinter import filedialog
from tkinter import ttk
from tkinter import messagebox
from tkinter import Frame
from tkinter import Text
from tkinter import Label
import RPi.GPIO as GPIO          
# import glob
from tkinter import StringVar






    

    
class Programm(Frame):
    def __init__(self):
        
        
        tk.Frame.pack(self)
        
        COUNT = 0
        temperature = 0
        arbeitsschritt = ("leerlauf")
        temp_c = 0
        p = GPIO.PWM(19,100)
        
        aufheizen_id = 0
        temp_id = 0
        temp = 0
        
        
        schritteins = False
        schrittzwei = False
        
        
        aufheizen_down =  73.0
        maltoserast_up =  68.0#40-50 Minuten
        maltoserast_down =  66.0
        amalyserast_up =  73.0 #10-20 Minuten
        amalyserast_down =  71.0
        
        self.lbl_free = tk.Label (self, text = "-----")
        self.lbl_free2 = tk.Label (self, text = "-----")
        self.start = tk.Button (self, height = 5, width = 50, text = "Aufheizen", command = self.schritteins_start())
        self.stop = tk.Button (self, height = 2, width = 50, text = "Stop", command =  self.stopbuttonclick())
        self.ruhren = tk.Button (self, text = "Rühren Ein", height = 2, width = 50,command = self.ruehren_ein())
        self.ruhren_aus = tk.Button (self, text = "Rühren Aus", height = 2, width = 50,command = self.ruehren_aus())
        self.heizen = tk.Button (self, text = "Heizen Ein", height = 2, width = 50,command = self.heizung())
        self.heizen_aus = tk.Button (self, text = "Heizen Aus", height = 2, width = 50,command = self.heizung_aus())
        self.einmaischen = tk.Button (self, text = "Einmaischen", height = 5, width = 50, command = self.schrittzwei_start())
        self.zurucksetzen = tk.Button (self, text = "Zurücksetzen", height = 2, width = 50, command = self.reset())
        self.Beenden = tk.Button (self, text = "Beenden", height = 2, width = 50, command = self.buttonBeendenClick())
        self.aktuell_temp_lbl = tk.Label (self, textvariable = self.temp)
        self.arbeitsschritt_lbl = tk.Label (self, textvariable = self.arbeitsschritt)
             
            
            
        self.lbl_free.grid(row = 16, column =0)
        self.start.grid(row=7, column=0)
        self.einmaischen.grid(row = 7, column = 1)
        self.stop.grid(row=9, column=0)
        self.ruhren.grid(row=12, column=0)
        self.ruhren_aus.grid(row=12, column=1)
        self.heizen.grid(row=13, column=0)
        self.heizen_aus.grid(row=13, column=1)
        self.lbl_free2.grid(row=11, column=0)
        self.zurucksetzen.grid(row=9, column=1)
        self.Beenden.grid(row=18, column=0)
        self.aktuell_temp_lbl(row=19, column=0)
        self.arbeitsschritt_lbl(row=19, column=0)
        
        mainWin.mainloop()
        
    def wasweissich(self):
        self.arbeitsschritt = tk.StringVar()
        self.temperature = tk.DoubleVar()
    
    def aktuelleTemperatur(self):
    
    # 1-wire Slave Datei lesen
        file = open('/sys/bus/w1/devices/28-0300a279c08b/w1_slave')
        self.filecontent = file.read()
        file.close()
        
        # Temperaturwerte auslesen und konvertieren
        self.stringvalue = self.filecontent.split("\n")[1].split(" ")[9]
        self.temp_c = float(self.stringvalue[2:]) / 1000
        
        self.temperatur.set(self.temp_c)
        print (self.temperatur.get())
        self.temp_id = self.after(5000, self.aktuelleTemperatur)
        
    def schritteins_start(self):
        
        if self.schritteins == False:
            
            self.arbeitsschritt.set("Aufheizen")
            print(arbeitsschritt.get)
            self.aufheizen()
        else:
            if messagebox.showinfo("Hinweis", "Anderer Prozess aktiv!"):
                pass
            
    def schrittzwei_start(self):
        if self.schrittzwei == False:
            self.schrittzwei = True
            self.arbeitsschritt.set("Maltoserast")
            self.maltoserast()
        else:
            if messagebox.showinfo("Hinweis", "Prozess aktiv!"):
                pass
    
    def stopper(self):
        #self.arbeitsschritt.set("Stop")
        GPIO.output(13, GPIO.LOW)
        print("Heizung aus")
        if self.schritteins == True:
            self.after_cancel(self.aufheizen_id)
            self.schritteins = False
        if self.schrittzwei == True:
            self.after_cancel(self.maltoserast_id)
            self.schrittzwei = False
                    
    def stopbuttonclick(self):
        self.stopper()
                
                
    
    def aufheizen(self):        
        
        #print("Programm Aufheizen")
        if self.temp_c < self.aufheizen_down:
            print(self.temp.get())
            
            self.arbeitsschritt.set("aufheizen")
            self.schritteins = True
            GPIO.output(13, GPIO.HIGH)
            self.heizung_lauft = True
            self.aufheizen_id = self.after(9000, self.aufheizen)
            print("Heizung ein")
            
                
        if self.temp_c > self.aufheizen_down:
            GPIO.output(13, GPIO.LOW)
            self.heizung_lauft = False
            print("Temperatur erreicht")
            
            if messagebox.showinfo("Hinweis", "Wasser ist aufgeheizt, Malz hinzugeben! Wenn es weitergeht OK drücken und auf Einmaischen gehen"):
                
                self.stopper()
                    
    
     
    def maltoserast(self):
        
        
        self.count = self.count +1
        if count == 1200 or count == 2400 or count == 3300:
            ruhren_lang()
            print("rührt")
            print(count)
            
        if temp_status < maltoserast_down: #and arbeitsschritt_fertig == 1:
            GPIO.output(13, GPIO.HIGH)
            Maltoserast_id = root.after(1000, maltose_rast)
            print("heizt Maltose")
            
        if temp_status > maltoserast_up:
            GPIO.output(13, GPIO.LOW)     
            Maltoserast_id = root.after(1000, maltose_rast)
            print("Heizung aus")
             
        if count == 3600:
            GPIO.output(13, GPIO.LOW)
            if messagebox.showinfo("Hinweis", "Verzuckerungsrast abgeschlossen"):
                count = 0
                arbeitsschritt_fertig = arbeitsschritt_fertig +1
                #root.after_cancel(maltoserast_ende)
                amalyse_rast()
                stopper()

    def amalyse_rast(self):
        
        self.count = self.count +1
        print(count)
        temp_status = temp.get()
        
        if count == 600 or count == 1000:
            ruehren_lang()
            print("rührt")
            
        if temp_status < amalyserast_down: #and arbeitsschritt_fertig == 2:
            GPIO.output(13, GPIO.HIGH)
            amalyserast_id = root.after(1000, amalyse_rast)
            print("heizen")
            
        if temp_status > amalyserast_up: # and arbeitsschritt_fertig == 2:
            GPIO.output(13, GPIO.LOW)
            amalyserast_id = root.after(1000, amalyse_rast)
            print("Heizung aus")
                
            
        if count == 1200:     
            if messagebox.showinfo("Hinweis", "Amalyse abgeschlossen"):
                count = 0
                arbeitsschritt_fertig = arbeitsschritt_fertig +1
                #root.after_cancel(amalyserast_ende)
                return
                print(arbeitsschritt_fertig)

    def ruehren_ein(self):   
        
        if self.ruehrt == False:
            self.ruehrt == True
            self.p.start(100)
                    
    
    def ruehren_aus(self):
        
        #if self.ruehrt == True:
        self.p.stop()
        self.ruehrt == False
    
    def ruehren_lang(self):
    
        
        if self.ruehrt == False:
            self.ruehrt == True
            self.p.start(100)
            self.after(200000, self.ruehren_aus)
    
    def heizung(self):
        if self.heizunglaeuft == False:
            GPIO.output(13, GPIO.HIGH)
            self.heizunglaeuft == True
            
    def heizung_aus(self):
        #if self.heizunglaeuft == True:
        GPIO.output(13, GPIO.LOW)
        self.heizunglaeuft == False
            
    def reset(self):
        pass
        
    def buttonBeendenClick(self):
        if messagebox.askyesno('Beenden', 'Soll das Programm wirklich beendet werden?'):
            self.stopper()
            GPIO.cleanup()
            self.quit()
            mainWin.destroy()
            
            
    def main():
        GPIO.setwarnings(False)           
        GPIO.setmode (GPIO.BCM)         
        GPIO.setup(13,GPIO.OUT)
        GPIO.setup(19,GPIO.OUT)
        GPIO.output(13, GPIO.LOW)
        mainWin = tk.Tk()
        
        
        
        
    if __name__ == "__main__":
        main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist ja jetzt alles verschlimmert. main ist falsch eingerückt und dort wird auch gar kein Frame mehr erzeugt. In __init__ wird immer noch pack aufgerufen, aber nicht mehr das __init__ von Frame. Dafür steht jetzt ein Aufruf von mainloop drin, der da absolut nichts verloren hat. Die Klassenattribute wurden zu lokalen Variablen statt zu Instanzattributen. Was hast du dir bei `wasweissich` gedacht? Alle Attribute werden in __init__ initialisiert.
Generell schreibt man keine hundert Zeilen Code ohne jedes Teilstück ausgiebig zu testen. Wenn du zu nicht funktionierendem Code noch mehr hinzugefügst, was auch nicht funktioniert, kann es nur Frust geben. Du übst ja auch keinen Salto, wenn du noch keine Flugrolle kannst. Nimm dir also eine Sache vor, die du übst, bis du sie kannst. Dass ich da so viele Punkte hatte liegt einfach nur daran, dass du schon zu viel Code geschrieben hattest, der nicht gut war. Also klein anfangen und Stück für Stück vorarbeiten.
Johnson81
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 07:11

Ich hatte mich auch langsam vorgearbeitet und die Basis hatte auch funktioniert, bis ich angefangen habe mit Klassen zu arbeiten.
Bei wasweiss ich war ich irgendwie frustriert. Also nochmal zurück und auf Anfang. Eigentlich sollte der Raspberry nur bei ein paar Temperaturen schalten. Aber dann wächst das Projekt aufeinmal stark an. Danke für die Geduld.
Johnson81
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 07:11

Ich hab jetzt nochmal ganz klein angefangen. Aber eine kurze Frage. Wo muss ich die StringVar Variablen initieren damit sie angezeigt werden? Vorher versuche ich gar nicht den Rest auf vordermann zu bringen. Vielleicht mit einem direkten Beispiel. Vieles ist auskommentiert, da ich auf meinem PC arbeite.

Code: Alles auswählen

import tkinter as tk
import time
from tkinter import Frame
from tkinter import filedialog
from tkinter import ttk
from tkinter import messagebox
from tkinter import Frame
from tkinter import Text
from tkinter import Label
#import RPi.GPIO as GPIO          
from tkinter import StringVar

class Hauptfenster(tk.Frame): 
    def __init__(self, master):
        
        
        #RUEHRWERK = GPIO.PWM(19,100)
            
        AUFHEIZEN_DOWN =  73.0
        MALTOSERAST_UP =  68.0#40-50 Minuten
        MALTOSERAST_DOWN =  66.0
        AMALYSERAST_UP =  73.0 #10-20 Minuten
        AMALYSERAST_DOWN =  71.0
        
        self.waslaeuftgrade = tk.StringVar()
        self.waslaeuftgrade.set("leerlauf")
        
        tk.Frame.__init__(self, master) 
        self.pack(expand='yes', fill='both')
        
        self.lbl_free = tk.Label (self, text = " ")
        self.lbl_free2 = tk.Label (self, text = " ")
        self.start = tk.Button (self, height = 5, width = 50, text = "Aufheizen")
        self.stop = tk.Button (self, height = 2, width = 50, text = "Stop")
        self.ruhren = tk.Button (self, text = "Rühren Ein", height = 2, width = 50)
        self.ruhren_aus = tk.Button (self, text = "Rühren Aus", height = 2, width = 50)
        self.heizen = tk.Button (self, text = "Heizen Ein", height = 2, width = 50)
        self.heizen_aus = tk.Button (self, text = "Heizen Aus", height = 2, width = 50)
        self.einmaischen = tk.Button (self, text = "Einmaischen", height = 5, width = 50)
        self.zurucksetzen = tk.Button (self, text = "Zurücksetzen", height = 2, width = 50)
        self.Beenden = tk.Button (self, text = "Beenden", height = 2, width = 50, command = self.buttonBeendenClick())
        #self.aktuell_temp_lbl = tk.Label (self )
        self.zustand = tk.Label (self, textvariable = self.waslaeuftgrade)
             
        self.lbl_free.grid(row = 16, column =0)
        self.start.grid(row=7, column=0)
        self.einmaischen.grid(row = 7, column = 1)
        self.stop.grid(row=9, column=0)
        self.ruhren.grid(row=12, column=0)
        self.ruhren_aus.grid(row=12, column=1)
        self.heizen.grid(row=13, column=0)
        self.heizen_aus.grid(row=13, column=1)
        self.lbl_free2.grid(row=11, column=0)
        self.zurucksetzen.grid(row=9, column=1)
        self.Beenden.grid(row=18, column=0)
        #self.aktuell_temp_lbl(row=19, column=0)
        self.zustand(row=19, column=0)

    def buttonBeendenClick(self):
            
            if messagebox.askyesno('Beenden', 'Soll das Programm wirklich beendet werden?'):
                self.stoppt_alles()
                #GPIO.cleanup()
                self.quit()
                self.destroy()
    
    def stoppt_alles(self):
        
        #GPIO.output(13, GPIO.LOW)
        
        self.waslaeuftgrade.set("Gestoppt")
        
        
        if self.schritteins == True:
            self.after_cancel(self.aufheizen_id)
            self.schritteins = False
        if self.schrittzwei == True:
            self.after_cancel(self.maltoserast_id)
            self.schrittzwei = False
        self.waslauftgrade.set("Beendet")
        


def _main():
#     GPIO.setwarnings(False)           
#     GPIO.setmode (GPIO.BCM)         
#     GPIO.setup(13,GPIO.OUT)
#     GPIO.setup(19,GPIO.OUT)
#     GPIO.output(13, GPIO.LOW)

    
    
    root = tk.Tk() 
    app = Hauptfenster(root) 
    root.mainloop() 

if __name__=='__main__': 
    _main()
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Johnson81: Das mit der `StringVar` funktioniert schon so wie Du das da machst. Es sind halt andere Fehler in dem Programm weshalb das nicht funktioniert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeile 19ff: Konstanten werden am Anfang der Datei definiert (nach den Importen) und nicht in einer Methode.
Zeile 25: StringVar sollte auch an `master` gebunden werden.
Zeile 29: Ein Frame sollte sich nicht selbst `pack`en.
Zeile 31ff: Zwischen Keyword, = und Wert kommen keine Leerzeichen, im Gegensatz zu einer Variablenzuweisung.
Zeile 57: Zustand kann man nicht aufrufen, das ist ein Label (sagt auch die Fehlermeldung deutlich).
Zeile 59: der Methodennamen hält sich nicht an die Namenskonvention (kleinschreibung)
Zeile 61: falsch eingerückt.
Zeile 74: keine expliziten Vergleiche mit True.
Zeile 84: was soll der Unterstrich?
Johnson81
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 07:11

Danke, danke, danke. Das hilft grade unendlich weiter!!
Antworten