Seite 1 von 1

Informatik-Projekt

Verfasst: Dienstag 18. Dezember 2012, 12:54
von Xander2403
Hallo, ich muss für meine Hausarbeit in Informatik ein Skript erstellen, welches eine Formel aus dem Bereich Bauingenieurwesen berechnet.
Das habe ich auch soweit getan, allerdings bekomme ich es nicht hin, dass der Berechnung-Button einen Wert ausgibt, ich hoffe mir kann jemand helfen bzw einen Lösungsansatz geben.

Hier die Codesnippets

Code: Alles auswählen

#Definition der Formeln und Rechnung

def berechnung():
    d=eval(ed.get())
    a=eval(ea.get())
    c=eval(ec.get())
    b=eval(eb.get())
    
    A=pi*(d*d/4)
    qstrich=25*a
    R=qstrich*A
    stuetze=(c*c/4)*b
    last=R+stuetze
    
    last.insert(0,last)
Das soll die Berechnung sein und ganz unten soll das dann ausgegeben werden:

Code: Alles auswählen

#Definition der Berechnen Button

b1=Button(text="Berechnen",command=berechnung)
b1.grid(row=7,column=0,columnspan=3)

#Ausgabebereich

last=StringVar()
Label(textvariable=last).grid(row=5,column=1,sticky="w")
In der Shell kommt diese Fehlermeldung:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
return self.func(*args)
File "C:\Users\Laptop\Desktop\Infomatik\datei.py", line 20, in berechnung
last.insert(0,a)
AttributeError: 'float' object has no attribute 'insert'

Ich weiß echt nicht mehr weiter, und hoffe auf eine Hilfestellung von den Profis :)

Re: Informatik-Projekt

Verfasst: Dienstag 18. Dezember 2012, 13:21
von lunar
@Xander2403 Der Fehler liegt darin, dass Du in "last=R+stuetze" den globalen Namen "last" überschreibst. Es gibt nach dieser Zeile zwei "last"s, ein globales, welches auf das Steuerelement verweist, und ein lokales, welches eine Fließkommazahl mit dem Ergebnis der Berechnung enthält. Da Python nicht raten kann, welches "last" Du möglicherweise meinen könntest, gilt die einfache Regel, dass lokale Namen „gewinnen“.

Die Lösung ist, das lokale "last" einfach umzubenennen:

Code: Alles auswählen

ergebnis = R + stuetze
    
last.insert(0, ergebnis)
Bitte spendiere Deinem Quelltext ein paar Leerzeichen um Operatoren herum und zwischen Argument, am besten entsprechend der Stil-Richtlinien. Das erhöht die Lesbarkeit Deines Quelltexts deutlich.

Da es sich bei Deinem Problem um recht grundlegendes Verständnis von Namen in Python handelt, ist eventuell auch der genaue Blick ins Tutorial empfehlenswert.

Re: Informatik-Projekt

Verfasst: Dienstag 18. Dezember 2012, 15:19
von Xander2403
Okay, das mit der doppelten Zuweisung der Variablen kann ich nachvollziehen, wenn ich das Skript auch soweit abändere, dann kommt folgende Fehlermeldung:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
return self.func(*args)
File "C:\Users\Laptop\Desktop\Infomatik\datei.py", line 21, in berechnung
last.insert(0, ergebnis)
AttributeError: 'StringVar' object has no attribute 'insert'

Ich habe dem StringVar () doch vorher die Variable last zugewiesen, die ja im darauffolgenden Label eingesetzt werden soll. Muss ich aber noch etwas in dem StringVar () einsetzen?

Danke für den Tipp mit den Leerzeichen, das werde ich dann komplett überarbeiten wenn ich die Sache abgeben muss ;)

Re: Informatik-Projekt

Verfasst: Dienstag 18. Dezember 2012, 15:25
von EyDu
Hallo.

Die Fehlermeldung verrät dir doch schon, was los ist: Variablen vom Typ StringVar haben kein insert-Attribut. Du musst StringVar.set verwenden.

Außerdem solltest du eval-Aufrufe durch float-Aufrufe ersetzen. eval wertet beliebige Pythonausdrücke aus, dass kann zu ungewünschtem Verhalten führen.

Re: Informatik-Projekt

Verfasst: Dienstag 18. Dezember 2012, 15:26
von Sirius3
schau doch einfach in der Dokumentation nach, welche Methoden ein StringVar-Objekt
unterstützt.