Seite 1 von 1

Sinus in python? xD

Verfasst: Freitag 27. März 2020, 16:52
von EddiMiY
Moin moin
Ich baue gerade ein "Rechner" für unsere Formelsammlung und brauche hilfe.
Formel für flächeninhalt eines Dreiecks:A=(g*h)/2 oder (1/2)*a*b*sin(γ)
die erste funktioniert perfekt aber die 2. gibt immer 0 aus :(
der fehler muss also bei meiner prozedur liegen.
Ich kann das programm hier nicht in den anhang tun oder finde es nicht also ist der quellcode hier :D








from tkinter import *
import math
# variable.get() holt den aktuellen Wert der Variable
# variable.set() gibt den aktuellen Wert der Variable vor
####Funktionen
def test(event):
if variable.get()=="Dreieck":
LbLbeschriftung1.set("g")
LbLbeschriftung2.set("h")
LbLbeschriftung3.set("a")
LbLbeschriftung4.set("b")
LbLbeschriftung5.set("γ°")
LbLbeschriftung6.set("---")
elif variable.get()=="Quadrat":
LbLbeschriftung1.set("a")
LbLbeschriftung2.set("---")
LbLbeschriftung3.set("---")
LbLbeschriftung4.set("---")
LbLbeschriftung5.set("---")
LbLbeschriftung6.set("---")
elif variable.get()=="Rechteck":
LbLbeschriftung1.set("a")
LbLbeschriftung2.set("b")
LbLbeschriftung3.set("---")
LbLbeschriftung4.set("---")
LbLbeschriftung5.set("---")
LbLbeschriftung6.set("---")
elif variable.get()=="Raute":
LbLbeschriftung1.set("g")
LbLbeschriftung2.set("h")
LbLbeschriftung3.set("e")
LbLbeschriftung4.set("f")
LbLbeschriftung5.set("---")
LbLbeschriftung6.set("---")
elif variable.get()=="Parallelogramm":
LbLbeschriftung1.set("g")
LbLbeschriftung2.set("b")
LbLbeschriftung3.set("h")
LbLbeschriftung4.set("---")
LbLbeschriftung5.set("---")
LbLbeschriftung6.set("---")
elif variable.get()=="Trapez":
LbLbeschriftung1.set("a")
LbLbeschriftung2.set("c")
LbLbeschriftung3.set("b")
LbLbeschriftung4.set("d")
LbLbeschriftung5.set("m")
LbLbeschriftung6.set("h")
elif variable.get()=="Drachenviereck":
LbLbeschriftung1.set("a")
LbLbeschriftung2.set("b")
LbLbeschriftung3.set("e")
LbLbeschriftung4.set("f")
LbLbeschriftung5.set("---")
LbLbeschriftung6.set("---")
elif variable.get()=="Kreis":
LbLbeschriftung1.set("d")
LbLbeschriftung2.set("r")
LbLbeschriftung3.set("---")
LbLbeschriftung4.set("---")
LbLbeschriftung5.set("---")
LbLbeschriftung6.set("---")
elif variable.get()=="Figuren↓↓↓":
LbLbeschriftung1.set("Die")
LbLbeschriftung2.set("folgenden")
LbLbeschriftung3.set("Label")
LbLbeschriftung4.set("werden")
LbLbeschriftung5.set("sich")
LbLbeschriftung6.set("umbenennen.")

def Rechnen():
if variable.get()=="Dreieck":
print("Dreieck")
if EingabeFeld1.get !="0" and EingabeFeld2.get !="0":
Erg=(int(EingabeFeld1.get()) * int(EingabeFeld2.get()))/2
ALbLbeschrifftung.set(Erg)
elif EingabeFeld3.get !="0" and EingabeFeld4.get !="0" and EingabeFeld5.get != "0":
γ=int(EingabeFeld5.get())
Erg=(1/2)*int(EingabeFeld3.get())*int(EingabeFeld4.get())* math.sin(γ) #math.sin(γ*math.pi/180) mir wurde das empholen oder math.sin(radians(γ))
ALbLbeschrifftung.set(Erg)

elif variable.get()=="Quadrat":
print("Quadrat")

elif variable.get()=="Rechteck":
print("Rechteck")

elif variable.get()=="Raute":
print("Raute")

elif variable.get()=="Parallelogramm":
print("Parallelogramm")

elif variable.get()=="Trapez":
print("Trapez")

elif variable.get()=="Drachenviereck":
print("Drachenviereck")

elif variable.get()=="Kreis":
print("Kreis")

elif variable.get()=="Figuren↓↓↓":
print("Ratter Ratter Ratter, Oh eine Fehler ist aufgetreten")


####GUI name
GUI = Tk()
GUI.title("Formelsammlung")
####Variablen
variable = StringVar(GUI)
LbLbeschriftung1 = StringVar(GUI)
LbLbeschriftung2 = StringVar(GUI)
LbLbeschriftung3 = StringVar(GUI)
LbLbeschriftung4 = StringVar(GUI)
LbLbeschriftung5 = StringVar(GUI)
LbLbeschriftung6 = StringVar(GUI)

ULbLbeschrifftung = StringVar(GUI)
ALbLbeschrifftung = StringVar(GUI)
####Auswahlfenster
data=("Figuren↓↓↓", "Dreieck", "Quadrat", "Rechteck","Raute","Parallelogramm","Trapez","Drachenviereck","Kreis")
variable.set("Figuren↓↓↓")
Auswahl = OptionMenu(GUI, variable, *data, command=test)
Auswahl.grid(row=0, column=0)

####Button
RechnenBTN = Button(GUI, command=Rechnen, text="Rechnen")
RechnenBTN.grid(row=1, column=0)
####Textbox
EingabeFeld1 = Entry(GUI)
EingabeFeld1 .grid(row=2, column=2)

EingabeFeld2 = Entry(GUI)
EingabeFeld2 .grid(row=3, column=2)

EingabeFeld3 = Entry(GUI)
EingabeFeld3 .grid(row=4, column=2)

EingabeFeld4 = Entry(GUI)
EingabeFeld4 .grid(row=5, column=2)

EingabeFeld5 = Entry(GUI)
EingabeFeld5 .grid(row=6, column=2)

EingabeFeld6 = Entry(GUI)
EingabeFeld6 .grid(row=7, column=2)

####Label
LbLbeschriftung1.set("Die")
LbLbeschriftung2.set("folgenden")
LbLbeschriftung3.set("label")
LbLbeschriftung4.set("werden")
LbLbeschriftung5.set("sich")
LbLbeschriftung6.set("umbenennen.")
label1 = Label(GUI, textvariable=LbLbeschriftung1,height=1, width=14)
label1.grid(row=2, column=1)

label2 = Label(GUI, textvariable=LbLbeschriftung2,height=1, width=14)
label2.grid(row=3, column=1)

label3 = Label(GUI, textvariable=LbLbeschriftung3,height=1, width=14)
label3.grid(row=4, column=1)

label4 = Label(GUI, textvariable=LbLbeschriftung4,height=1, width=14)
label4.grid(row=5, column=1)

label5 = Label(GUI, textvariable=LbLbeschriftung5,height=1, width=14)
label5.grid(row=6, column=1)

label6 = Label(GUI, textvariable=LbLbeschriftung6,height=1, width=14)
label6.grid(row=7, column=1)

label9 = Label(GUI, text="Bitte geben sie nur ganze zahlen ein",height=1, width=30)
label9.grid(row=0, column=2)
label9 = Label(GUI, text="fall sie keinen wert haben setzen sie ein [0] ein",height=1, width=35)
label9.grid(row=1, column=2)
####
label7 = Label(GUI, text="Flächeninhalt=",height=1, width=14)
label7.grid(row=8, column=1)
ALbL = Label(GUI, textvariable=ALbLbeschrifftung,height=1, width=14)
ALbL.grid(row=8, column=2)

label8 = Label(GUI, text="Umfang=",height=1, width=14)
label8.grid(row=9, column=1)
ULbL = Label(GUI, textvariable=ULbLbeschrifftung,height=1, width=14)
ULbL.grid(row=9, column=2)
####


mainloop()







ich glaube ich stehe auf dem schlauch

Re: Sinus in python? xD

Verfasst: Freitag 27. März 2020, 19:26
von noisefloor
Hallo,

den Quelltext bitte in eine Code-Block setzen, sonst ist das nicht lesbar. Den bekommst, du, indem du im vollständigen Editor auf die `</>` Schaltfläche klickst.

Zu deiner Frage:
Die trigonometrischen Funktionen des `math` Modul erwarten den Winkel im Bogenmaß, nicht Grad. Wenn du Grad hast - was ja in Schule & Co eher üblich ist - dann musst du konvertieren:

Code: Alles auswählen

>>> import math
>>> math.sin(90)
0.8939966636005579
>>> math.sin(math.radians(90))
1.0
>>>
Zum GUI-Code: auf jeden Fall klassen-basiert programmieren, nicht als Spaghetti-Code. Sonst ist das ziemlich schnell nicht wart- und erweiterbar.

Gruß, noisefloor

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 13:43
von EddiMiY
noisefloor hat geschrieben: Freitag 27. März 2020, 19:26 Hallo,

den Quelltext bitte in eine Code-Block setzen, sonst ist das nicht lesbar. Den bekommst, du, indem du im vollständigen Editor auf die `</>` Schaltfläche klickst.

Zu deiner Frage:
Die trigonometrischen Funktionen des `math` Modul erwarten den Winkel im Bogenmaß, nicht Grad. Wenn du Grad hast - was ja in Schule & Co eher üblich ist - dann musst du konvertieren:

Code: Alles auswählen

>>> import math
>>> math.sin(90)
0.8939966636005579
>>> math.sin(math.radians(90))
1.0
>>>
Zum GUI-Code: auf jeden Fall klassen-basiert programmieren, nicht als Spaghetti-Code. Sonst ist das ziemlich schnell nicht wart- und erweiterbar.

Gruß, noisefloor

Ja danke, aber das habe ich schon versucht was ja auch dahinter steht

Code: Alles auswählen

def Rechnen():
    if variable.get()=="Dreieck":
        print("Dreieck")
        if EingabeFeld1.get !="0" and EingabeFeld2.get !="0": 
            Erg=(int(EingabeFeld1.get()) * int(EingabeFeld2.get()))/2 
            ALbLbeschrifftung.set(Erg)
        elif EingabeFeld3.get !="0" and EingabeFeld4.get !="0" and EingabeFeld5.get != "0":
            Erg=(1/2)*int(EingabeFeld3.get())*int(EingabeFeld4.get())* math.sin(math.radians(int(EingabeFeld5.get())))  #math.sin(γ*math.pi/180) mir wurde das empholen oder math.sin(radians(γ)) 
            ALbLbeschrifftung.set(Erg)
aber irgendwie kommt wenn a=4 b=5 und γ=35, 0 raus obwohl eigentlich 5,735... raus kommen sollten

Wieso?

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 13:56
von Sirius3
get ist eine Methode. Da fehlen also überall Flow Klammern.
EingabeFeld1 bis 7 sind nicht sehr sprechende Namen. Was verbirgt sich hinter den Nummern? Benutze keine Abkürzungen. Wenn Du Ergebnis meinst, dann schreibe nicht Erg sondern ergebnis.

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 16:19
von EddiMiY
Sirius3 hat geschrieben: Samstag 28. März 2020, 13:56 get ist eine Methode. Da fehlen also überall Flow Klammern.
EingabeFeld1 bis 7 sind nicht sehr sprechende Namen. Was verbirgt sich hinter den Nummern? Benutze keine Abkürzungen. Wenn Du Ergebnis meinst, dann schreibe nicht Erg sondern ergebnis.
Du kannst dir ja mal oben den quellcode kopieren, dann siehst du das die eigabefelder halt immer für andere sachen zuständig sind, also geht nur ein allgemeiner name :roll:
und was meinst du mit Flow Klammern?

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 16:29
von Sirius3
*-Importe sind böse™, weil man unkontrolliert hunderte Namen in den eigenen Namensraum schaufelt. Tkinter wird üblicherweise per `import tkinter as tk` importiert und alle Namen via tk.xyz angesprochen.
Wenn man durchnummerierte Variablennamen hat, will man eigentlich Listen verwenden.
In `test` hast Du sehr viel kopierten Code. Mit der richtigen Datenstruktur wird das deutlich übersichtlicher.
Du hast an drei verschiedenen Stellen Unterscheidungen nach der Form, idealerweise sollte das nur an einer Stelle sein.
Alles was eine Funktion braucht sollte sie über ihre Argumente bekommen, keine globalen Variablen.
Auf oberster Ebene sollten nur (Funktions)definitionen stehen.

Viele Funktions- und Variablennamen sind schlecht. Eine Funktion die die Beschriftung der Labels anpasst, sollte nicht `test` heißen. Und warum kürzt Du Label mit LBL ab?
`label9` wird auch zweimal benutzt, ohne dass es auffällt.

Code: Alles auswählen

import tkinter as tk
from functools import partial
from itertools import zip_longest
import math


BESCHRIFTUNG = {
    "Figuren↓↓↓": ["Die", "folgenden", "Label", "werden", "sich", "umbenennen."],
    "Dreieck": ["g", "h", "a", "b", "γ°"],
    "Quadrat": ["a"],
    "Rechteck": ["a", "b"],
    "Raute": ["g", "h", "e", "f"],
    "Parallelogramm": ["g", "b", "h"],
    "Trapez": ["a", "c", "b", "d", "m", "h"],
    "Drachenviereck": ["a", "b", "e", "f"],
    "Kreis": ["d", "r"],
}

def change_labeling(beschriftungen, geometry_type):
    for beschriftung, text in zip_longest(beschriftungen, BESCHRIFTUNG[geometry_type], fillvalue='---'):
        beschriftung.set(text)


def rechnen(flaecheninhalt, eingabefelder, geometry_type):
    werte = {}
    for beschriftung, eingabe in zip(BESCHRIFTUNG[geometry_type.get()], eingabefelder):
        werte[beschriftung] = float(eingabe.get()) if eingabe.get() else None
    ergebnis = "Fehler!"
    if geometry_type.get() == "Dreieck":
        print("Dreieck")
        if werte['g'] and werte['h']:
            ergebnis = werte['h'] * werte['g'] / 2
        elif werte["a"] and werte["b"] and werte["γ°"]:
            ergebnis = werte["a"] * werte["b"] * math.sin(math.radians(werte["γ°"])) / 2
    flaecheninhalt.set(ergebnis)

def main():
    root = tk.Tk()
    root.title("Formelsammlung")
    geometry_type = tk.StringVar(root, 'Figuren↓↓↓')
    beschriftungen = [tk.StringVar(root, b) for b in BESCHRIFTUNG['Figuren↓↓↓']]
    flaecheninhalt = tk.StringVar(root)
    umfang = tk.StringVar(root)

    auswahl = tk.OptionMenu(root, geometry_type, *BESCHRIFTUNG, command=partial(change_labeling, beschriftungen))
    auswahl.grid(row=0, column=0)

    eingabefelder = []
    for row_index, beschriftung in enumerate(beschriftungen, 2):
        tk.Label(root, textvariable=beschriftung,height=1, width=14).grid(row=row_index, column=1)
        eingabefeld = tk.Entry(root)
        eingabefeld.grid(row=row_index, column=2)
        eingabefelder.append(eingabefeld)

    tk.Button(root, command=partial(rechnen, flaecheninhalt, eingabefelder, geometry_type), text="Rechnen").grid(row=1, column=0)
    tk.Label(root, text="Bitte geben sie nur ganze zahlen ein",height=1, width=30).grid(row=0, column=2)
    tk.Label(root, text="fall sie keinen wert haben setzen sie ein [0] ein",height=1, width=35).grid(row=1, column=2)
    tk.Label(root, text="Flächeninhalt=",height=1, width=14).grid(row=8, column=1)
    tk.Label(root, textvariable=flaecheninhalt,height=1, width=14).grid(row=8, column=2)
    tk.Label(root, text="Umfang=",height=1, width=14).grid(row=9, column=1)
    tk.Label(root, textvariable=umfang,height=1, width=14).grid(row=9, column=2)
    root.mainloop()

if __name__ == '__main__':
    main()

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 16:33
von __blackjack__
@EddiMiY: Wenn nur ein allgemeiner Name geht, dann muss man das halt anders lösen. Das ist so wie es ist schwer zu verstehen und fehleranfällig.

Auf keinen Fall sollten die Namen durchnummeriert sein. Wenn man Namen durchnummeriert will man entweder bessere Namen verwenden, das geht ja hier nicht, oder eine Datenstruktur verwenden. In diesem Fall eine Liste.

Ich Tippe auf Autokorrektur bei dem Flow und es waren Aufrufklammern gemeint.

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 18:57
von noisefloor
Hallo,
aber irgendwie kommt wenn a=4 b=5 und γ=35, 0 raus obwohl eigentlich 5,735... raus kommen sollten
Also ich bekomme da ca. 8,5 raus... Sowohl mit Python 3.6.9 als auch dem alten 2.7.17

Code: Alles auswählen

>>> import math
>>> 0.5*4*5*math.sin(math.degrees(35))
8.500972684543623
Gruß, noisefloor

Re: Sinus in python? xD

Verfasst: Samstag 28. März 2020, 23:14
von EddiMiY
noisefloor hat geschrieben: Samstag 28. März 2020, 18:57 Hallo,
Also ich bekomme da ca. 8,5 raus... Sowohl mit Python 3.6.9 als auch dem alten 2.7.17

Code: Alles auswählen

>>> import math
>>> 0.5*4*5*math.sin(math.degrees(35))
8.500972684543623
Gruß, noisefloor


Mein gott🤦🏼‍♂️genau da ist der fehler https://prnt.sc/rokdap
Das sollte raus kommen und es geht mir nicht darum wie schlecht mein programm aufgebaut ist sonder warum es ein falsches Ergebnis ausgibt.
Denn wenn ich genau das in meinem programm eingebe kommt 0 raus.

Einfach nur wo der Fehler in meiner rechnung ist oder so was🤦🏼‍♂️
Und es ist mir echt egal ob ich Label mit Lbl abkürze oder nicht weil ich damit klar komme und genau so komme ich auch mit meinen anderen Beschriftungen klar.

Wo ist der Fehler in meinem Programm?
Weil das mit g und h ja funktioniert

Re: Sinus in python? xD

Verfasst: Sonntag 29. März 2020, 00:25
von __blackjack__
@EddiMiY: Beide Fehler wurden bereits genannt. Der dritte ist dann wahlweise entweder das Du das Ergebnis einfach so in das Label schreibst, oder dass das Label eine Längenbeschränkung hat. Der Effekt davon ist nämlich das man das Ergebnis nicht komplett lesen kann.

Es mag Dir ja egal sein und Du magst damit klarkommen, aber Du erwartest ja offenbar das sich andere das durchlesen wollen. Oder Du magst halt keine Hilfe bekommen. 🤷