Taschenrechner programmieren
Verfasst: Donnerstag 24. Februar 2022, 12:30
Hallo,
ich muss für ein Informatik Projekt einen Taschenrechner programmieren. Allerdings komm ich schon seit Tagen nicht weiter, da ich zwar ein Widget habe aber mein Taschenrechner nichts rechnen will. Mir wird auch keine Fehlermeldung angezeigt und ich weiß einfach nicht was ich tun soll. Kann mir jemand von euch weiterhelfen. Danke im vorraus. Alles hinter dem # könnt Ihr ignorieren, das sind nur Hilfestellungen für mich, da ich das Projekt nochmal vorstellen muss.
LG
import tkinter as tk #Tkinter ist ein vorinstalliertes Modul welches nur noch Importiert werden muss, tkinter
#wird jetzt tk genannt in unserem Code, durch das `as`
rechner = tk.Tk() #rechner ist unsere Variable, Ihr weisen wir die Funktionsweise des Objektes "tk.Tk()" zu
# hiermit bestimmt man die Größe der Benutzteroberfläche (gui), dies ist zurzeit nur ein
#weißes Fenster
rechner.geometry('400x450') # Mit dem Objekt der Klasse "geometry" können wir die Größe unseres Fenster festlegen
rechner.title('Taschenrechner') # mit dem Objekt der Klasse "title" können wir dem erstellten Fenster einen Namen geben
button_values = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '+', #Die Werte der Buttons werden in der Variable
'-', '0', '*', '/', '=', 'AC'] #"button_values" gespeichert
gui_items = list() #Der Variable "gui_items" weisen wir die Funktion einer (noch leeren) Liste aus
calculation = str()
def create_button(value): #Damit aus den einzelnen "button_values" tatsächlich Buttons werden
button = tk.Button(text=value) #erstellen wir eine Funktion, die aus jedem einzelnen Element der "button_values" einen Button erstellt
gui_items.append(button) # und diesen Button dann in die Liste "Gui_items" ablegt
for val in button_values: # jetzt wird diese Funktion für alle Elemente in der Liste aufgeführt → Button ist erstellt
create_button(val)
output_label = tk.Label(text='Hallo Klasse.') #Durch das Objekt der Klasse "Label" können wir ein Widget mithilfe von tk.Tk() erstellen
#Das Widget ist in diesem Fall unsere Anzeige, in der das Ergebnis der Rechnung stehen wird
#Anfangs, steht dort Hallo Klasse.
output_label.grid(row=0, columnspan=10) #Durch das Objekt der Klasse "grid" können wir einstellen in welcher Zeile (Zeilenbreite) und Spalte (Spaltenbreite) unser Text sich befindet
column_count = 0 #Die Buttons beginnen in Spalte 0
row_count = 1 #Die Buttons beginnen in Zeile 1
max_columns = 4 #und es gibt maximal 4 Spalten, bevor eine neue Zeile anfängt
for item in gui_items: #Das Programm durchläuft jetzt die "gui_items" Liste und ordnet deren Elemente in Gittern an
item.grid(row=row_count, column=column_count) #Die items (elemente aus der Liste) werden in Gittern angeordnet, deren Zeilen und Spalten den Werten der Variablen "row count" "column_count" entsprechen
column_count += 1 #Jeder weitere Button kommt in eine neue Zeile
if column_count == max_columns: #Wenn man beim maximalen, also beim 4. Button angekommen ist
column_count = 0 #Dann geht es nicht mehr in der Spalte
row_count += 1 #sondern in einer neuen Zeile weiter
if __name__ == '__main__':
rechner.mainloop() #Die Funktion des Objekts "tk.Tk()" wird durch die Methide "mainloop" gestartet
#Durch das Aufrufen der Methode "mainloop" stoppt die Abarbeitung des Python codes und es beginnt ein eventloop
#Das GUI Fenster wird geöffnet und es wird geschaut, ob ein Event auftritt (Interaktion des GUI Fensters mit dem Benutzer), wenn das passiert, dann verändert sich das Fenster dementsprechend
calculation = str() #leere Zeichenkette die wir als string definieren also abfolge von verschieden Zahlen und Wörtern
#Calculation ist die Variable für String
def add_button_value_to_calculation(values): #Hier wird der Wert des gedrückten Buttons zu der leeren Zeichenkette hinzugefügt
global calculation # Die Variable calculation ist global das heist dass sie sowohl in der Hauptfunktion als auch in der
# Unterfunktion den selben wert hat sobald man keine lokale Variable mit dem selben Namen hat
#globaler Gültigkeitsberecih, überall gültig
calculation = calculation + values #
output_label['text'] = calculation #Label ist ein Widget, welches man sich anschauen kann aber nicht mit interagieren kann
def add_button_value_to_calculation(value) :
global calculation
if val == 'AC': # AC (auch 'ALL CLEAR' genannt) löscht alles aus der Zeile, wenn der Wert AC benutzt wird
calculation = str() #Unsere Variable calculation ist jetzt wieder aus der Klasse String
output_label['text'] = '...' #nichts wird wieder ausgegeben und man geht an den Anfang der Variablen zurück3
return
if val == '=':
calculate : calculation
calculation = str()
return
calculation = calculation + val
output_label['text'] = calculation
def calculate(calc): #Hier definieren wir die Zeichenkette als Berechnung
try:
result : eval(calc) #eval bedeutet dass der String in eine Berechnung umgewandelt werden
print(result)
output_label['text'] = result
except Exception as e:
print(e)
output_label['text'] = 'Error'
def create_button(value): #
button = tk.Button(text=value, command=lambda: add_button_value_to_calculation(value))
gui_items.append(button)
ich muss für ein Informatik Projekt einen Taschenrechner programmieren. Allerdings komm ich schon seit Tagen nicht weiter, da ich zwar ein Widget habe aber mein Taschenrechner nichts rechnen will. Mir wird auch keine Fehlermeldung angezeigt und ich weiß einfach nicht was ich tun soll. Kann mir jemand von euch weiterhelfen. Danke im vorraus. Alles hinter dem # könnt Ihr ignorieren, das sind nur Hilfestellungen für mich, da ich das Projekt nochmal vorstellen muss.
LG

import tkinter as tk #Tkinter ist ein vorinstalliertes Modul welches nur noch Importiert werden muss, tkinter
#wird jetzt tk genannt in unserem Code, durch das `as`
rechner = tk.Tk() #rechner ist unsere Variable, Ihr weisen wir die Funktionsweise des Objektes "tk.Tk()" zu
# hiermit bestimmt man die Größe der Benutzteroberfläche (gui), dies ist zurzeit nur ein
#weißes Fenster
rechner.geometry('400x450') # Mit dem Objekt der Klasse "geometry" können wir die Größe unseres Fenster festlegen
rechner.title('Taschenrechner') # mit dem Objekt der Klasse "title" können wir dem erstellten Fenster einen Namen geben
button_values = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '+', #Die Werte der Buttons werden in der Variable
'-', '0', '*', '/', '=', 'AC'] #"button_values" gespeichert
gui_items = list() #Der Variable "gui_items" weisen wir die Funktion einer (noch leeren) Liste aus
calculation = str()
def create_button(value): #Damit aus den einzelnen "button_values" tatsächlich Buttons werden
button = tk.Button(text=value) #erstellen wir eine Funktion, die aus jedem einzelnen Element der "button_values" einen Button erstellt
gui_items.append(button) # und diesen Button dann in die Liste "Gui_items" ablegt
for val in button_values: # jetzt wird diese Funktion für alle Elemente in der Liste aufgeführt → Button ist erstellt
create_button(val)
output_label = tk.Label(text='Hallo Klasse.') #Durch das Objekt der Klasse "Label" können wir ein Widget mithilfe von tk.Tk() erstellen
#Das Widget ist in diesem Fall unsere Anzeige, in der das Ergebnis der Rechnung stehen wird
#Anfangs, steht dort Hallo Klasse.
output_label.grid(row=0, columnspan=10) #Durch das Objekt der Klasse "grid" können wir einstellen in welcher Zeile (Zeilenbreite) und Spalte (Spaltenbreite) unser Text sich befindet
column_count = 0 #Die Buttons beginnen in Spalte 0
row_count = 1 #Die Buttons beginnen in Zeile 1
max_columns = 4 #und es gibt maximal 4 Spalten, bevor eine neue Zeile anfängt
for item in gui_items: #Das Programm durchläuft jetzt die "gui_items" Liste und ordnet deren Elemente in Gittern an
item.grid(row=row_count, column=column_count) #Die items (elemente aus der Liste) werden in Gittern angeordnet, deren Zeilen und Spalten den Werten der Variablen "row count" "column_count" entsprechen
column_count += 1 #Jeder weitere Button kommt in eine neue Zeile
if column_count == max_columns: #Wenn man beim maximalen, also beim 4. Button angekommen ist
column_count = 0 #Dann geht es nicht mehr in der Spalte
row_count += 1 #sondern in einer neuen Zeile weiter
if __name__ == '__main__':
rechner.mainloop() #Die Funktion des Objekts "tk.Tk()" wird durch die Methide "mainloop" gestartet
#Durch das Aufrufen der Methode "mainloop" stoppt die Abarbeitung des Python codes und es beginnt ein eventloop
#Das GUI Fenster wird geöffnet und es wird geschaut, ob ein Event auftritt (Interaktion des GUI Fensters mit dem Benutzer), wenn das passiert, dann verändert sich das Fenster dementsprechend
calculation = str() #leere Zeichenkette die wir als string definieren also abfolge von verschieden Zahlen und Wörtern
#Calculation ist die Variable für String
def add_button_value_to_calculation(values): #Hier wird der Wert des gedrückten Buttons zu der leeren Zeichenkette hinzugefügt
global calculation # Die Variable calculation ist global das heist dass sie sowohl in der Hauptfunktion als auch in der
# Unterfunktion den selben wert hat sobald man keine lokale Variable mit dem selben Namen hat
#globaler Gültigkeitsberecih, überall gültig
calculation = calculation + values #
output_label['text'] = calculation #Label ist ein Widget, welches man sich anschauen kann aber nicht mit interagieren kann
def add_button_value_to_calculation(value) :
global calculation
if val == 'AC': # AC (auch 'ALL CLEAR' genannt) löscht alles aus der Zeile, wenn der Wert AC benutzt wird
calculation = str() #Unsere Variable calculation ist jetzt wieder aus der Klasse String
output_label['text'] = '...' #nichts wird wieder ausgegeben und man geht an den Anfang der Variablen zurück3
return
if val == '=':
calculate : calculation
calculation = str()
return
calculation = calculation + val
output_label['text'] = calculation
def calculate(calc): #Hier definieren wir die Zeichenkette als Berechnung
try:
result : eval(calc) #eval bedeutet dass der String in eine Berechnung umgewandelt werden
print(result)
output_label['text'] = result
except Exception as e:
print(e)
output_label['text'] = 'Error'
def create_button(value): #
button = tk.Button(text=value, command=lambda: add_button_value_to_calculation(value))
gui_items.append(button)