Skala mit Eingabefeld koppeln

Fragen zu Tkinter.
Antworten
cuphead
User
Beiträge: 1
Registriert: Freitag 7. Mai 2021, 19:16

Guten Abend zusammen,

ich möchte das bei meinem BMI Rechner die Gewichtsskala mit dem Gewichtseingabefeld verbunden ist und das die Größenskala mit dem Größeneigabefeld gekoppelt ist. Ich weiß allerdings nicht genau wie und bitte hier also mir auf die Sprünge zu helfen. :)

Zur Zeit gebe ich Werte in mein Eingabefeld ein, dann verschiebt sich auch die Skala. Verschiebe ich allerdings nur den Regler der Skala, so werden keine Werte an mein Eingabefeld gesendet. Wie kann ich dies also richtig koppeln?

Zudem würde mich interessieren, wie die Fehlermeldung "Achtung","Ungültig. Bitte gebe einen gültigen Wert (Zahl) ein" auch erscheint, wenn man 0 eintippt. Bisher kommt die Fehlermeldung nur, wenn der Wert keine Zahl ist. Hilft mir da der Operator OR weiter in der Zeile " if(Groesse.isdigit() or Gewicht.isdigit()):"? Quasi das ich dort or <=0 noch miteinbinde?

Zum besseren Verständnis hier mein Code:

Code: Alles auswählen


from tkinter import * 
import tkinter.messagebox 

class BMI: 
    def __init__(self,root):
        self.root = root 
        self.root.title("Body Mass Index Rechner") 
        self.root.geometry("1043x481+0+0")
        self.root.configure(background='#FFD7D7')

        Hauptrahmen = Frame(self.root,bd=15,width=900,height=450,padx=10,pady=7,bg="#FFD7D7",relief=RIDGE)
        Hauptrahmen.grid()
        LinkerRahmen = Frame(Hauptrahmen,bd=10,width=500,height=450,padx=10,pady=7,bg="#FFD7D7",relief=RIDGE)
        LinkerRahmen.pack(side=LEFT) 
        RechterRahmen = Frame(Hauptrahmen,bd=10,width=400,height=450,padx=10,pady=7,bg="#FFD7D7",relief=RIDGE)
        RechterRahmen.pack(side=RIGHT) 

        LinkerRahmen0 = Frame(LinkerRahmen,bd=3,width=500,height=85,padx=3,pady=3,bg="#E0A2A2",relief=RIDGE)
        LinkerRahmen0.grid(row=1,column=0) 
        LinkerRahmen1 = Frame(LinkerRahmen,bd=3,width=500,height=170,padx=3,pady=3,relief=RIDGE) 
        LinkerRahmen1.grid(row=2,column=0) 
        LinkerRahmen2 = Frame(LinkerRahmen,bd=3,width=500,height=95,padx=3,pady=3,relief=RIDGE)
        LinkerRahmen2.grid(row=3,column=0) 
        LinkerRahmen3 = Frame(LinkerRahmen,bd=3,width=500,height=125,padx=3,pady=3,relief=RIDGE)
        LinkerRahmen3.grid(row=4,column=0) 
        RechterRahmen0 = Frame(RechterRahmen,bd=3,width=400,height=85,padx=3,pady=1,relief=RIDGE)
        RechterRahmen0.grid(row=1,column=0) 
        RechterRahmen1 = Frame(RechterRahmen,bd=3,width=400,height=220,padx=3,pady=1,relief=RIDGE)
        RechterRahmen1.grid(row=2,column=0) 
        RechterRahmen2 = Frame(RechterRahmen,bd=3,width=400,height=85,padx=3,pady=1,relief=RIDGE)
        RechterRahmen2.grid(row=3,column=0) 

        var1 = StringVar() 
        var2 = StringVar() 
        var3 = DoubleVar()
        var4 = DoubleVar()

        def Beenden():
            Beenden = tkinter.messagebox.askyesno("Body Mass Index","Bestätige wenn Du Verlassen möchtest") 
            if Beenden > 0:
                root.destroy() 
                return     

        def Zurücksetzen():
            var1.set("")
            var2.set("")
            var3.set(0)
            var4.set(0)
            self.txtBMIErgebnis.delete("1.0",END)

        def BMI_Rechner():
            Groesse=(var1.get())
            Gewicht=(var2.get())
            self.txtBMIErgebnis.delete("1.0",END)
            if(Groesse.isdigit() or Gewicht.isdigit()):
                Groesse=float(Groesse)
                Gewicht=float(Gewicht)
                BMI=float('%.2f'%(Gewicht / ((Groesse/100)**2))) 
                self.txtBMIErgebnis.insert(END,BMI)
                var3.set(Groesse)
                var4.set(Gewicht)
                return True
            else: 
                tkinter.messagebox.showwarning("Achtung","Ungültig. Bitte gebe einen gültigen Wert (Zahl) ein")
                var1.set("")
                var2.set("")
                var3.set(0)
                var4.set(0)
                self.txtBMIErgebnis.delete("1.0",END) 

        self.lblTitle = Label(LinkerRahmen0,text="Body Mass Index Rechner", padx=10,pady=3,bd=1,width=24,height=2,fg="#000000",font=('Verdana',28,'bold'),bg='#E0A2A2')
        self.lblTitle.pack()
        self.Koerpergroesse = Scale(RechterRahmen0,variable=var3, from_=120, to=220,length=385,tickinterval=10,orient = HORIZONTAL,label="Größe in cm",font=('Verdana',10,'bold'))
        self.Koerpergroesse.grid(row=1,column=0)             
        self.Koerpergewicht = Scale(RechterRahmen2,variable=var4, from_=40, to=150,length=385,tickinterval=10,orient = HORIZONTAL,label="Gewicht in kg",font=('Verdana',10,'bold'))
        self.Koerpergewicht.grid(row=1,column=0) 
        self.lblBMITabelle=Label(RechterRahmen1,font=('Verdana',16,'bold'),text="\tBMI Tabelle").grid(row=0,column=0)
        self.txtBMITabelle=Text(RechterRahmen1,height=12,width=38,bd=16,font=('Verdana',12,'bold'))
        self.txtBMITabelle.grid(row=1,column=0,columnspan=3) 
        self.txtBMITabelle.insert(END, 'Bedeutung \t\t\t' + "BMI-Wert \n\n") 
        self.txtBMITabelle.insert(END, 'Kritisches Untergewicht \t\t\t' + "< 17.5 \n\n")
        self.txtBMITabelle.insert(END, 'Untergewicht \t\t\t' + "17.5 - 19 \n\n")
        self.txtBMITabelle.insert(END, 'Normalgewicht \t\t\t' + "19 - 25 \n\n")
        self.txtBMITabelle.insert(END, 'Übergewicht \t\t\t' + "25 - 30 \n\n")
        self.txtBMITabelle.insert(END, 'Kritisches Übergewicht \t\t\t' + "> 30 \n\n")

        self.lblGroesse=Label(LinkerRahmen1,text="Größe in Zentimetern eingeben:",font=('Verdana',16,'bold'),bd=2,width=30,height=3,justify=LEFT) 
        self.lblGroesse.grid(row=1,column=0,padx=15)
        self.txtGroesse=Entry(LinkerRahmen1,textvariable = var1,font=('Verdana',16,'bold'),bd=3,width=11,justify=RIGHT)
        self.txtGroesse.grid(row=1,column=1,pady=10)  

        self.lblGewicht=Label(LinkerRahmen1,text="Gewicht in Kilogramm eingeben:",font=('Verdana',16,'bold'),bd=2,height=3,width=30,justify=LEFT)
        self.lblGewicht.grid(row=2,column=0)
        self.txtGewicht=Entry(LinkerRahmen1,textvariable = var2,font=('Verdana',16,'bold'),bd=3,width=11,justify=RIGHT)
        self.txtGewicht.grid(row=2,column=1,pady=10)

        self.lblBMIErgebnis=Label(LinkerRahmen2,text="Dein BMI-Wert beträgt:",font=('Verdana',16,'bold'),bd=2,width=29)
        self.lblBMIErgebnis.grid(row=0,column=0)
        self.txtBMIErgebnis=Text(LinkerRahmen2,padx=12,pady=12,font=('Verdana',16,'bold'),bd=5,bg="#E0A2A2",width=12,height=1,relief=SUNKEN)
        self.txtBMIErgebnis.grid(row=0,column=1)

        self.buttonBMI=Button(LinkerRahmen3,text="Berechne BMI",font=('Verdana',16,'bold'),bd=4,pady=2,padx=4,width=11,height=4,command=BMI_Rechner)
        self.buttonBMI.grid(row=1,column=0)

        self.buttonZurücksetzen=Button(LinkerRahmen3,text="Zurücksetzen",font=('Verdana',16,'bold'),bd=4,padx=4,pady=2,width=11,height=4,command=Zurücksetzen)
        self.buttonZurücksetzen.grid(row=1,column=1)
        
        self.buttonBeenden=Button(LinkerRahmen3,text="Verlassen",font=('Verdana',16,'bold'),bd=4,pady=2,padx=4,width=11,height=4,command=Beenden)
        self.buttonBeenden.grid(row=1,column=2)


if __name__=='__main__':
    root = Tk()
    application = BMI(root)
    root.resizable(width=False, height=False)
    root.mainloop()

Ich bedanke mich schonmal für jegliche Hilfe!! :D :D

Liebe Grüße,

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

Bevor ich mich mit dem Code auseinander setzen möchte, sollte er umstrukturiert werden.
Benutze keine *-Importe, weil es damit unmöglich wird, herauszufinden, woher welcher Name kommt. Dann brauchen GUIs eigentlich immer Klassendefinitionen. Also richtige Klassen und nicht nur ein __init__ in ein class verschachtelt. Die Funktionen in __init__ sollten Methoden sein, und damit etliche nicht-lokale Variablen zu Attributen werden. Variablennamen, Attribute und Methoden werden komplett mit Kleinbuchstaben geschrieben. var1 bis var4 brauchen sprechende Namen.
Nicht jedes Label und jeder Button muß an self gebunden werden.
Antworten