Undefinierbarer Fehler ohne Fehlermeldung|Promillerechner

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
11apfelsaft11
User
Beiträge: 3
Registriert: Sonntag 20. August 2017, 21:19

Hallo liebe Community,ich bin ein Programmierneuling und bin heute bei meiner Hausaufgabe auf Unbenannt.txt]ein Problem gestoßen wobei ich einfach nicht weiter weis, da weder eine Fehlermeldung auftaucht oder sonst etwas passiert. Wir sollen für unsere Hausaufgabe unseren Promillerechner(die Rechnung für den Promillewert etc. habe ich in einem anderen Programm), soweit wie möglich auszubauen und ich habe in meiner GUI eine Listbox angelegt, in der verschiedene alkoholische Getränke aufgezählt sind, welche man auswählen kann. Ich wollte das ganze benutzerfreundlich machen, indem man ein Getränk auswählt und dann die dazu passende Prozentzahl sofort in das entryPercent Eingabefeld eingetragen wird. Diese Idee hab ich versucht umzusetzen in den Zeilen 48-72(Ich schätze dort liegt auch irgendwo der Fehler). Wenn man die Schleife(Z56) weglässt, startet das Programm, aber meine Idee funktioniert nicht. Ich hoffe man versteht mein Problem und das mir jemand weiterhelfen kann, da ich absolut nicht weiter weis. Ich freue mich auch über jeden Tipp zur einer effizienteren Programmierung o.Ä. und natürlich über jede Antwort. :)

Code: Alles auswählen

from tkinter import *

root = Tk()

def giveDataPerson():
    alterPerson = entryAge.get()
    geschlechtPerson = entryGender.get()
    groeßePerson = entryHeight.get()
    massePerson = entryBodyweight.get()
    entryAge.delete(0, END)
    entryGender.delete(0, END)
    entryHeight.delete(0, END)
    entryBodyweight.delete(0, END)
    entryVolumeDrink.delete(0, END)
    entryPercent.delete(0, END)
    
def giveDataDrink():
    volumenGetraenk = entryVolumeDrink.get()
    anteilAlkohol = entryPercent.get()
    Liste = listDrinks.get("active")
    entryVolumeDrink.delete(0, END)
    entryPercent.delete(0, END)
    
#Hauptfenster
root["bg"]="#FE9A2E"
        
labHeader = Label(root, text="Promillerechner")
labAge = Label(root, text="Alter:")
labGender = Label(root, text="Gesschlecht(m/w):")
labHeight = Label(root, text="Größe in cm?")
labBodyweight = Label(root, text="Wieviel Kg wiegen sie?")
labSpace = Label(root, text=" ")
labVolumeDrink = Label(root, text="Wieviel Liter haben sie konsumiert?")
labPercent = Label(root, text="Alkoholanteil?")

imgAdd = PhotoImage(file="C:/Users/RAGWE/Desktop/Bilder/1600.png")

bAdd = Button(root, image=imgAdd, command=giveDataDrink)
bConfirm = Button(root, text="Bestätigen", command=giveDataPerson)

entryAge = Entry(root, width=20)
entryGender = Entry(root, width=20)
entryHeight = Entry(root, width=20)                      
entryBodyweight = Entry(root, width=20)
entryVolumeDrink = Entry(root, width=20)
entryPercent = Entry(root, width=20)

listDrinks = Listbox(root, height=4)
listDrinks.insert("end", "Bier", "Cognac", "Gin", "Rum", "Tequila", "Vodka", "Wein", "Whisky")
choosen = listDrinks.get("active")

scrollDrinks = Scrollbar(root, orient=VERTICAL)
listDrinks["yscrollcommand"]=scrollDrinks.set
scrollDrinks["command"]=listDrinks.yview

while listDrinks.get("active"):
    if choosen == "Bier":
        entryPercent.insert(0, "5")
    elif choosen == "Cognac":
        entryPercent.insert(0, "40")
    elif choosen == "Gin":
        entryPercent.insert(0, "45")
    elif choosen == "Rum":
        entryPercent.insert(0, "50")    
    elif choosen == "Tequila":
        entryPercent.insert(0, "45")
    elif choosen == "Vodka":
        entryPercent.insert(0, "50")
    elif choosen == "Wein":
        entryPercent.insert(0, "12")
    else:
        entryPercent.insert(0, "40")
                 
labHeader["fg"]="#000000"
labHeader["bg"]="#FE9A2E"
labHeader["height"]="2"
labHeader["width"]="20"
labHeader["anchor"]="n"
labHeader["font"]="Courier 16 bold"
labAge["bg"]="#FE9A2E"
labAge["anchor"]="e"
labGender["bg"]="#FE9A2E"
labGender["anchor"]="e"
labHeight["bg"]="#FE9A2E"
labHeight["anchor"]="e"
labBodyweight["bg"]="#FE9A2E"
labBodyweight["anchor"]="e"
labSpace["bg"]="#FE9A2E"
labVolumeDrink["bg"]="#FE9A2E"
labVolumeDrink["anchor"]="e"
labPercent["bg"]="#FE9A2E"
labPercent["anchor"]="e"
#bAdd["width"]=""
bAdd["anchor"]="e"
                    
#Widgets platzieren
labHeader.grid(row=1, column=0, columnspan=2)
labAge.grid(row=2, column=0)
entryAge.grid(row=2, column=1)
labGender.grid(row=3, column=0)
entryGender.grid(row=3, column=1)
labHeight.grid(row=4, column=0)
entryHeight.grid(row=4, column=1)
labBodyweight.grid(row=5, column=0)
entryBodyweight.grid(row=5, column=1)
labSpace.grid(row=6, column=0, columnspan=5)
labVolumeDrink.grid(row=7, column=0)
entryVolumeDrink.grid(row=7, column=1)
labPercent.grid(row=8, column=0)
entryPercent.grid(row=8, column=1)
listDrinks.grid(row=7, column=5, rowspan=2)
scrollDrinks.grid(row=7, column=5, rowspan=2, sticky=N+S+E)
bAdd.grid(row=7, column=4, rowspan=2)
bConfirm.grid(row=10, column=1)

root.mainloop()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@11apfelsaft11: Du hast eine while-Schleife, und was denkst Du, bewirkt die?
11apfelsaft11
User
Beiträge: 3
Registriert: Sonntag 20. August 2017, 21:19

Sirius3 hat geschrieben:@11apfelsaft11: Du hast eine while-Schleife, und was denkst Du, bewirkt die?
Dass sobald etwas anderes ausgewählt wird,der Wert in der entryPercent Zeile aktualisiert wird.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@11apfelsaft11: nur, dass das nicht so funktioniert. Bei GUI-Programmierung mußt Du auf Ereignisse reagieren, also wenn jemand einen anderen Eintrag in der Listbox auswählt. Das geht nicht mit einer Schleife, sondern ähnlich wie bei Deinen Buttons, mit einer Funktion.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mit anderen Worten: Deine while-Schleife fragt gefühlt 1 Mio Mal pro Sekunde die Listbox ab. Das ist sicher nicht das, was du dir vorgestellt hast...
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@snafu: das eine Million mal Abfragen ist gar nicht das eigentliche Problem, sondern, dass das Programm nicht weiter macht, es also nie in mainloop landet, dass der Nutzer überhaupt die Chance hätte, irgendetwas auszuwählen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Eine GUI arbeitet mit einer Ereignis-Schleife. Diese "empfängt" Ereignisse, aktualisiert die GUI und führt Callbacks aus. Blockiert man diese eine mainloop, geht gar nichts mehr. Das ist so das Grundprinzip jeder GUI. Die while-schleife führst du aus, bevor überhaupt die Mainloop läuft. D.h. es können noch nicht einmal Ereignisse abgefragt werden. Du wirst eher mit Callbacks arbeiten müssen. Dazu am besten mal Beispielcode ansehen, in dem für ein Button das Keyword command genutzt wird. Beim klicken des Buttons, wird dann die übergebene Funktion ausgeführt. Die macht dann das, was passieren soll, wenn z.B. ein Button angeklickt wird.

Fang erst mal ganz einfach damit an. Dann kannst du das später für dein eigentliches Programm adaptieren. Du wirst eh noch auf de Problem stoßen, wie man z.B. ein Argument der zu aufrufenden Funktion mit übergibt (z.B. Werte aus Eingabefeldern).
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
11apfelsaft11
User
Beiträge: 3
Registriert: Sonntag 20. August 2017, 21:19

Ich hab das ganze etwas umgeschrieben und mein vorheriges Problem gelöst nur stehe ich jetzt erneut vor einem Problem, wobei ich nicht weiter weis. Ich habe nun die Rechnung für den Promillewert eingesetzt, aber jetzt lässt mich Python nicht mehr mit float Werten rechnen. Hat das wieder etwas mit der GUI zu tun?

Code: Alles auswählen

def giveDataPerson():
    agePerson = entryAge.get()
    genderPerson = entryGender.get()
    heightPerson = entryHeight.get()
    massPerson = entryBodyweight.get()
    entryAge.delete(0, END)
    entryGender.delete(0, END)
    entryHeight.delete(0, END)
    entryBodyweight.delete(0, END)
    entryVolumeDrink.delete(0, END)
    if agePerson > "18" and genderPerson == "m" :
        reductionsFactor = 0.7
    else :
        reductionsFactor = 0.6
    massAlcohol = 0
    massAlcohol = 10 * volumeDrink * portionAlcohol * 0.8 + massAlcohol
    concentrationAlcohol = massAlcohol / (massPerson * reductionsFactor)
    if genderPerson == "m" :  #Rechnung Mann
        bloodAlcoholConcentration = (0.8 * massAlcohol)/(1.055*(2.447 - 0.09516 * agePerson + 0.1074 * heightPerson + 0.3362 * massPerson))
    
    else :                    #Rechnung Frau
        bloodAlcoholConcentration = (0.8 * massAlcohol)/(1.055*(-2.097 + 0.1069 * heightPerson + 0.2466 * massPerson))
    if genderPerson == "m" :
        soberingTime = concentrationAlcohol / 0.2
    else :
        soberingTime = concentrationAlcohol / 0.1
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst mal dein Typenchaos bereinigen. In Python sind strings nicht magisch Fliesskommawerte. So gilt zB "2" > "18".... Macht dir also alles kaputt.

Entweder benutzt du die in tkinter vorgesehene Möglichkeit der DoubleVar, um gleich Fliesskommawerte zu erhalten. Oder du wandelst vorher sauber um.
Antworten