Python Winkelberechnung?
Hi,
Ich möchte mit sin cos tan einem Nutzer ermöglichen durch seine Eingabe den Winkel zu berechnen, dabei kann er über ein Menü verwalten, welche Berechnung erfolgen soll.
Wie soll das funktionieren und welche Befehle muss man einsetzten?
MFG
Du hast doch hier schon Antworten bekommen: https://www.gutefrage.net/frage/python-sin-cos-tan - was war daran unklar?
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.
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()
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()