Python Winkelberechnung?

jo135  19.07.2023, 11:15

Du hast doch hier schon Antworten bekommen: https://www.gutefrage.net/frage/python-sin-cos-tan - was war daran unklar?

ZennyT 
Fragesteller
 19.07.2023, 11:21

Mir wird da keine Antwort angezeigt, versuche es mal am PC liegt dann wahrscheinlich am Smartphone, tut mir leid für die Umstände

1 Antwort

Woran scheiterst du denn bis jetzt? Grafische Benutzeroberflächen kannst du mit tkinter bauen. Die Winkelfunktionen findest du in der math-Bibliothek (beachte, dass die Winkelfunktionen in python alle im Radians rechnen (also ein voller Kreis ist 2*Pi und nicht 360°) die musst du also mit math.radians() erst umrechnen)

Wenn du mit einer grafischen Oberfläche noch nicht klarkommst, kannst du das Programm ja erstmal als Konsolenprogramm (also mit Texteingaben) bauen.


daCypher  19.07.2023, 14:07

Ich hab dir mal was zusammengebastelt, womit du dir vielleicht erstmal einen groben Überblick machen kannst und es halt je nach Lust und Laune anpassen kannst

import tkinter as tk
import math
import re

def calculate(sender = None):
    result_box["text"] = calculations[calc_id.get()](float(input_box.get()))

window = tk.Tk()

calc_id = tk.IntVar()

tk.Label(window, text="Wähle eine Rechenoption").pack()
tk.Radiobutton(window, text="sin", variable=calc_id, value=0).pack()
tk.Radiobutton(window, text="cos", variable=calc_id, value=1).pack()
tk.Radiobutton(window, text="tan", variable=calc_id, value=2).pack()
tk.Radiobutton(window, text="sinh", variable=calc_id, value=3).pack()
tk.Radiobutton(window, text="cosh", variable=calc_id, value=4).pack()
tk.Radiobutton(window, text="tanh", variable=calc_id, value=5).pack()

tk.Label(window, text="Gib deine Zahl ein").pack()
input_box = tk.Entry(window, validate='key', validatecommand=(window.register(lambda v: re.fullmatch('\d+.?\d*|.\d+', v)!=None), '%P'))
input_box.pack()
input_box.bind('<Return>', calculate)

tk.Label(window, text="Ergebnis").pack()
result_box = tk.Label(window, text="")
result_box.pack()

calculations = [
    lambda v: math.sin(math.radians(v)),
    lambda v: math.cos(math.radians(v)),
    lambda v: math.tan(math.radians(v)),
    lambda v: math.degrees(math.sinh(v)),
    lambda v: math.degrees(math.cosh(v)),
    lambda v: math.degrees(math.tanh(v))
]

tk.Button(window, text="Rechnen", command=calculate).pack()

tk.mainloop()
0
daCypher  19.07.2023, 14:41

Nochmal mit ein paar Kommentaren und einen Bug im Validator behoben:

import tkinter as tk
import math
import re

# Das hier ist die eigentliche Rechenfunktion, die aufgerufen wird,
# wenn man auf "Rechnen" klickt oder nach der Eingabe der Zahl Return drückt
# dieses "sender = None" ist für das Event, was bei Return mitgesendet wird,
# aber beim Klick auf "Rechnen" nicht dabei ist. Da wir es nicht brauchen
# geben wir dem Parameter "sender" einfach einen Standardwert
def calculate(sender = None):
    result_box["text"] = round(calculations[calc_id.get()](float(input_box.get())),8)

# Ein neues Fenster erstellen
window = tk.Tk()

# Die Variable, in der die gewünschte Rechenoperation gespeichert wird
calc_id = tk.IntVar()

# Der Text "Wähle eine Rechenoperation"
tk.Label(window, text="Wähle eine Rechenoption").pack()

# Der Frame hier ist nur dafür da, dass die einzelnen Radiobuttons schön
# untereinander ausgerichtet sind
radiogroup = tk.Frame(window)
radiogroup.pack()

# Hier werden die Auswahlbuttons für die jeweiligen Rechenoperationen erstellt
button_labels = ["sin", "cos", "tan", "sinh", "cosh", "tanh"]
for label_id in range(len(button_labels)):
    tk.Radiobutton(radiogroup, text=button_labels[label_id], variable=calc_id, value=label_id).pack(anchor="w")

# Das hier ist ein Array mit den Rechenfunktionen, die je nach Auswahl
# ausgeführt werden soll. Beachte, dass der Index aus diesem Array jeweils
# mit der value des Radiobuttons für die Funktion übereinstimmt
# (also 0 = sin, 1 = cos, 2 = tan etc.)
calculations = [
    lambda x: math.sin(math.radians(x)),
    lambda x: math.cos(math.radians(x)),
    lambda x: math.tan(math.radians(x)),
    lambda x: math.degrees(math.sinh(x)),
    lambda x: math.degrees(math.cosh(x)),
    lambda x: math.degrees(math.tanh(x))
]

# Der Text "Gib deine Zahl ein"
tk.Label(window, text="Gib deine Zahl ein").pack()
# Hier wird das Eingabefeld erstellt. Ich hab noch eine validation hinterlegt,
# damit man wirklich nur Zahlen eingeben kann
input_box = tk.Entry(window, validate='key', validatecommand=(window.register(lambda v: re.fullmatch('\d+\.?\d*|.\d+', v)!=None), '%P'))
input_box.pack()
# Hier binde ich noch die Return-Taste an die calculate-Funktion,
# also man muss nicht auf "Rechnen" klicken, sondern kann auch einfach Return drücken
input_box.bind('<Return>', calculate)

# Hier kommen noch zwei Labels für den Text "Ergebnis" und für das Ergebnis
tk.Label(window, text="Ergebnis").pack()
result_box = tk.Label(window, text="")
result_box.pack()

# Und ein Button mit der Aufschrift "Rechnen"
tk.Button(window, text="Rechnen", command=calculate).pack()

# Diesen mainloop muss man aufrufen, damit das Programm nicht gleich zu Ende ist
# und man das Fenster überhaupt sehen kann
tk.mainloop()
0