Taschenrechner

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
helloeverybodyy
User
Beiträge: 2
Registriert: Dienstag 20. August 2019, 13:20

Guten Morgen zusammen

Ich bin neu hier in Python und muss einen Taschenrechner programmieren. Soweit habe ich, glaube ich zumindest, alles programmiert, aber mein Taschenrechner rechnet nichts zusammen und zeigt mir nicht an was ich gedrückt habe. Kurz zuvor hatte ich die Fehlermeldung : SyntaxError: unexpected EOF while parsing. Das konnte ich jetzt beheben, aber leider komme ich nun nicht mehr weiter. Wie gesagt rechnet es nicht zusammen und zeigt mir auch nichts an. Wäre schön wen mir Jemand sagen könnte was ich falsch mache.

Freundliche Grüsse

Das ist mein Code: (mit den Abständen ist eigentlich alles ok, ich weiss allerdings nicht wieso es sie hier nicht anzeigt)




from tkinter import *
import math
import self as self
import sys
print(sys.stdin)


class Calculator(object):
output = False
submit = False
window = False

def __init__(self):
self.window = Tk()
self.window.title("Calculator")
self.window.resizable(False, False)
self.__build()
self.__display()
self.evaluate()
self.__calc()
self.window.mainloop()

def evaluate(self):
print.configure(text="Ergebnis: " + str(eval(Calculator.get)))

def __calc(self, value):
calcOpt = ("/", "+", "-", "*")

if Button == "=":
if "+":
print(eval(value + value))

if "-":
print(eval(value - value))

if "*":
print(eval(value * value))

if "/":
print(eval(value / value))


def __build(self):
grid = [
(0, 0, "-"),
(0, 1, "7"), (1, 1, "8"), (2, 1, "9"), (3, 1, "/"),
(0, 2, "4"), (1, 2, "5"), (2, 2, "6"), (3, 2, "*"),
(0, 3, "1"), (1, 3, "2"), (2, 3, "3"), (3, 3, "-"),
(0, 4, "0"), (1, 4, "C"), (2, 4, "="), (3, 4, "+")
]
for (col, row, text) in grid:
if col == 0 and row == 0:
self.output = Entry(self.window, text=text, state="disabled")
self.output.grid(column=col, row=row, columnspan=4, sticky=E + W)
else:
button = Button(self.window, text=text, command=lambda value=text: self.__calc(value))
button.grid(column=col, row=row)

def __display(self):
self.window.mainloop()


Calculator()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

helloeverybodyy hat geschrieben: Donnerstag 5. September 2019, 08:44

Code: Alles auswählen

import self as self
Was soll dieser Import denn darstellen?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Guten Morgen helloeverybodyy,

Du soltlest Sternchenimporte nicht verwenden, weil Du damit unkontrollierbar Namen in den eigenen Namensraum schaufelst. Bei tkinter wird üblicherweise `import tkinter as tk` geschrieben und alle Namen per z.B. tk.Button oder tk.E angesprochen.

Was soll das `import self as self`? Woher hast Du ein Modul mit den Namen `self`? Das wird auch gar nicht benutzt und kann weg.
Ebenso `sys`. Das wird auch nicht sinnvoll verwendet.

Klassenattribute sind kein Ersatz dafür, Instanzattribute zu initialisieren. `Calculater.window` wird zudem sofort von einem Instanz-Attribut gleichen Namens überdeckt.
`submit` wird gar nicht verwendet und `output` unsinnigerweise in einer Schleife ständig mit neuen Werten belegt.
Klassenattribute sind sehr selten, und wenn, dann meist Konstanten, bei Dir können die einfach weg.

Alle Methoden mit doppelten Unterstrichen sind eigentlich welche, die maximal einen Unterstrich haben sollten (außer __init__ natürlich). Doppelte Unterstriche sind selten nötig.
Alles was in __build steht, wäre besser direkt in __init__ aufgehoben. `grid` wäre besser eine Konstante, die außerhalb der Methode definiert wird. Der Fall 0/0 sollte eigentlich nicht in der Schleife stehen, weil der sowieso komplett anders behandelt wird, wie der Rest.
Statt des lambda-Ausdrucks wäre functools.partial besser.

Die Methode __display, die dann in __init__ aufgerufen wird, ist aus mehreren Gründen schlecht. Erstens tut sie nicht, was der Name vermuten läßt. Sie stellt nicht nur das Fenster dar, sondern behandelt auch, per mainloop alle Events. Die Funktion kehr auch nicht zurück. Damit kehrt __init__ nicht zurück, Du arbeitest also die ganze Zeit mit einem nicht vollständig initialisierten Objekt. mainloop sollte immer außerhalb von __init__, am besten im Hauptprogramm aufgerufen werden.

Danach sieht __init__ so aus, als ob Du ein linear ablaufendes Programm schreiben wolltest, was aber bei GUIs nicht geht. evaluate würde zu dem Zeitpunkt gar kein Ergebnis haben, weil der Nutzer noch gar keine Zeit hatte, etwas einzugeben.
Der Aufruf von __calc erfolgt bei Dir über die Knöpfe, das direkt aufzurufen macht keinen Sinn.

Die Methode evaluate benutzt `print.configure` was gar nicht existiert, du wollstest wahrscheinlich `self.output.configure` schreiben. Calculator.get exisitert auch nicht, da wolltest Du wahscheinlich auf das Ergebnis zugreifen, das im Moment noch gar nicht existiert und am besten ein Attribut von `self` wäre.

Die Methode __calc macht noch gar nicht das, was sie tun sollte, wenn sie dazu da ist, die Information zu verarbeiten, die über die Knöpfe kommt.
`Button` ist eigentlich `tk.Button` und ist die Knopf-Klasse, die niemals gleich ' =' sein kann. Die nachfolgenden if-Abfragen sind immer wahr, weil da gar nichts verglichen wird, sondern nur ein nicht leerer String auf nicht-Leerheit geprüft wird. `value` ist immer nur der Text, der auf dem gedrückten Knopf steht; da Dich aber auch interessiert, was vorher gedrückt wurde, muß das Programm sich das irgendwie merken.

Du merkst, da ist noch vieles nicht richtig. Dir fehlen noch viele Grundlagen und so etwas komplexes wie einen Taschenrechner schüttelt auch ein fortgeschrittener Programmierer nicht so einfach aus dem Ärmel.

Auch wenn es hart klingt, Du mußt nochmal drei vier Schritte zurückgehen. Vergiss das mit der GUI erst einmal und programmiere eine Taschenrechner-Klasse, mit einer Methode `press_button` die die Aktion ausführt und als Ergebnis den String zurück gibt, der auf dem Display erscheinen würde.
Überleg Dir zuerst, welchen internen Status der Taschenrechner haben müßte.
Was passiert, wenn man eine Zahl eingibt?
Was passiert, wenn man noch eine Zahl eingibt?
Was passiert, wenn man eine Rechenoperation eingibt?
Antworten