Informatik-Projekt

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
Xander2403
User
Beiträge: 2
Registriert: Dienstag 18. Dezember 2012, 12:47

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 :)
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.
Xander2403
User
Beiträge: 2
Registriert: Dienstag 18. Dezember 2012, 12:47

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 ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

schau doch einfach in der Dokumentation nach, welche Methoden ein StringVar-Objekt
unterstützt.
Antworten