Fehler????

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
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

ich habe ein weiteres problem! das programm soll anhand in entrys (Tkinter) eingegebenen zahlen die xAchse-Schnittpunkte einer quadratischen Funktion berechnen!

Code: Alles auswählen

....
a=einga.get()
b=einga.get()
c=eingc.get()

x0=-b/(2*a)
y0=c - b**2/(4*a)
if y0<0:
     spunkt=Label(page2, bg="red", fg="black",font=("Arial",12), text = "S("+float(x0)+"|"+float(y0)+")")
     spunkt.place(x=250,y=200)
.....
ein button ist auch für die berechnungeingebaut aber dann kommt diese fehlermeldung!

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1417, in __call__
return self.func(*args)
File "/home/vitaliy/Desktop/Schule/Informatik/Python/Programme in Bearbeitung/tabs2.py", line 133, in br
x0=-b/(2*a)
TypeError: bad operand type for unary -: 'str'
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

x0=-b/(2*a)
TypeError: bad operand type for unary -: 'str'
Du kannst einen String nicht negativieren ;) Mit einem Cast zu einem Zahlentypen wird da ein Schuh draus.
text = "S("+float(x0)+"|"+float(y0)+")"
Warum float() hier? Du willst doch offensichtlich Strings zusammenfügen. :?: BTW, würdest Du vorher richtig casten, wäre Dein x0/y0 schon float und müßte hier wieder zu str konvertiert werden.
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

ich habe es verher in IDLE gemacht und da hat es so funktioniert (Z.44)! hier das erste programm (könnt ihr gerne mal testen! ist recht nützlich in Mathe!) :

Code: Alles auswählen


from Tkinter import *
import Tkinter as tk


print "           Wertetabelle einer quadratischen Funktion  f(x)=ax²bx+c"
print "           --------------------------------------------------------"
print
print
nochmal=1
while nochmal==1:
    a=float(raw_input(" a = "))
    b=float(raw_input(" b = "))
    c=float(raw_input(" c = "))

    print
    print

    print "    x       |    y       "
    print "-------------------------"

    for i in range(-100,101,1):
        x=float(i/10.0)
        y=a*(x*x)+(b*x)+c
        if x==-10:
            print " ",x,"    |  ",float(y)," "
        elif x==0:
            print "   ",x,"    |  ",float(y)," "
        elif x==10:
            print "  ",x,"    |  ",float(y)," "
        elif 1==x or 2==x or 3==x or 4==x or 5==x or 6==x or 7==x or 8==x or 9==x:
            print "   ",x,"    |  ",float(y),"  "
        elif -9==x or -8==x or-7==x or -6==x or -5==x or-4==x or -3==x or -2==x or -1==x:
            print "  ",x,"    |  ",float(y),"  "


        
    #weiter 
    print
    print
    x0=-b/(2*a)
    y0=c - b**2/(4*a)
    print " S=(",float(x0),"|",float(y0),")"
    print
    print


    
    class Koordinatensystem:
        def __init__(self):        
            # Kordinatensystem
            import Tkinter as tk
            self.master=tk.Tk()
            self.master.title("y=f(x)=ax²+bx+c")


            self.canvasframe=tk.Frame()
            self.canvasframe.pack(fill="both",expand=1)
            self.canvas=tk.Canvas(self.canvasframe,width=930,height=930,bg="white",scrollregion=(0,0,1065,1065))
            self.canvas.pack(side="left",fill="both",expand=1)
            self.canvascenter()

            self.yscroll=tk.Scrollbar(self.canvasframe,orient="vertical",command=self.canvas.yview)
            self.yscroll.pack(fill="y",side="right")
            self.xscroll=tk.Scrollbar(orient="horizontal",command=self.canvas.xview)
            self.xscroll.pack(fill="x")
            self.canvas.config(xscrollcommand=self.xscroll.set,yscrollcommand=self.yscroll.set)
            self.bgvar=tk.IntVar()
            self.bgvar.set(1)
            self.zoomvar=tk.StringVar()
            self.zoomvar.set("1")
            self.graphen=[]
            self.bg()

        
        def bg(self):
            self.zoom=float(self.zoomvar.get())
            zoom=self.zoom
            for item in self.canvas.find_all():
                self.canvas.delete(item)
            if zoom != None:
                self.zoom=zoom
            if self.bgvar.get():
                self.bglines=[]
                for i in range(20+(10*self.zoom),1040,10*self.zoom):
                    self.bglines.append(self.canvas.create_line(15,i,1050,i,fill="gray"))
                    self.bglines.append(self.canvas.create_line(i,15,i,1050,fill="gray"))
            self.canvas.create_line(15,530,1050,530)
            self.canvas.create_line(530,15,530,1050)
            for i in range(-10,11):
                if y0<1000 or y0>-1000:
                    if i is not 0:
                        self.canvas.create_text(540,self.cy(i)+480,text=str(i))
                        self.canvas.create_text(self.cx(i)+485,520,text=str(i))
                        zo=50

            for graph in self.graphen:
                if graph.state=="aktive":
                    graph.aktivate(manuel=50)
            self.canvas.update()


            x=-10.0
            y=((-1)*(a*(x*x)+(b*x)+c))
            #Parabel    
            for i in range(-100,102,1): 
                xneu=x        
                yneu=y
                x=float(-1*(i/10.0))
                y=((-1)*(a*(x*x)+(b*x)+c))

                #Umwandlung
                xs=530+x*zo
                ys=530+y*zo
                xe=530+xneu*zo
                ye=530+yneu*zo

                self.bglines.append(self.canvas.create_line(xs,ys,xe,ye,fill="red"))


                
        def canvascenter(self):
            self.canvas.xview_moveto(0.122/2)
            self.canvas.yview_moveto(0.122/2)        


        def cx(self,nr):
            if nr != None:
                return (nr*50*self.zoom)+45
            else: return None

        def cy(self,nr):
            if nr != None:
                return 50-(nr*50*self.zoom)
            else: return None





    Koordinatensystem()

    untw=((b**2)-4*a*c)
    if untw>0:
        dis1=untw**0.5
        x1=((-b)+dis1)/(2*a)
        x2=((-b)-dis1)/(2*a)
        print " x1= ",float(x1)
        print " x2= ",float(x2)
    else:
        print "Parabel liegt über der x-Achse!"
    print
    print
    print

    print "Weitere Berechnungen durchführen?"
    noch=raw_input(" -> ")
    if "ja"==noch:
        nochmal=1
    else:
        nochmal=0
        print
        print
    if nochmal==1:
        print
        print
        print
        print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
        print "--------------------------------------------------------------------------------"
        print
        print
        print
        print "           Wertetabelle einer quadratischen Funktion  f(x)=ax²*bx+c"
        print "           --------------------------------------------------------"
        print
        print
        print



da gabs keine probleme!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

In deinem 1. Programm castest du noch die Eingabe in einen Float (Z. 13-15). Das musst du wieder machen, z.B.:

Code: Alles auswählen

a=float(einga.get())
b=float(einga.get())
Und formatier deinen String doch so:

Code: Alles auswählen

text = "S(%f|%f)" % (x0, y0)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Entschuldige, aber das Programm ist programmiertechnisch ziemlicher Unsinn (ich hab keine Lust, da jetzt auf die Einzelheiten einzugehen).

Benutze bitte für so lange Code-Abschnitte einen Pastebin, die Boardsoftware kommt mit so langen Sourcecodes nicht gut zurecht.

Zu Deinem Anfangsproblem:
Dein neuerlicher Code hat nichts damit zu tun, da Du, erstens, die Eingabe hier plötzlich zu float konvertiert, oben aber nicht (a=float(raw_input(" a = "))) und, zweitens, die Ausgabe mit print und Kommata vornimmst, print holt sich hierbei die Stringrepräsentation eines Objektes und schreibt diese aus, wohingegen Stringaddition auch Strings erwartet.
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

@ ice2k3
In deinem 1. Programm castest du noch die Eingabe in einen Float (Z. 13-15). Das musst du wieder machen, z.B.:
Code: (Python)
1
2

a=float(einga.get())
b=float(einga.get())
wenn ich das so mache erscheint ne neue fehlermeldung!
Traceback (most recent call last):
File "/home/vitaliy/Desktop/Schule/Informatik/Python/Programme in Bearbeitung/tabs2.py", line 85, in <module>
a=float(einga.get())
ValueError: empty string for float()


außerdem verschwidet aus ihrgenteinem grund der "Berechen" Button!?????




für den zwieten tipp danke ich dir!
BlackJack

@meister56: Eine leere Zeichenkette ist eben keine Darstellung einer Gleitpunktzahl.

Was den Button angeht: Es darf in einem Programm immer nur ein Exemplar von `Tkinter.Tk` geben. Sonst können die interessantesten Sachen passieren.

Andererseits kann bei Deinem Programm auch *überhaupt nichts* mit der GUI passieren, weil Du die Hauptschleife von `Tkinter` gar nicht ausführst.

Und Du erstellst in jedem Schleifendurchlauf eine neue Klasse. Das ist auch ziemlich unsinnig.
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

^^das zweite reingestellte programm funktioniert ja nur beim ersten entstehen immer wieder probleme!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Sollen wir jetzt raten, was damit nicht stimmt? Mit etwas mehr Code abeitet das Orakel zuverlässiger.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

meister56 hat geschrieben:^^das zweite reingestellte programm funktioniert ja nur beim ersten entstehen immer wieder probleme!
Eigentlich sollte es dich eher wundern, dass das zweite "funktioniert" ...

Mal ehrlich (jerch hat es ja schon angesprochen): Dein Code ist gruselig, man weiß gar nicht, wo man anfangen soll. Andererseits ist die Problemstellung für den Anfang (Schule) sicher keine schlechte Idee (habe ich vor viiiiielen Jahren mit meinem programmierbaren Taschenrechner auch gemacht - allerdings ohne die gezeichnete Parabel) und könnte dazu dienen, dass du an diesem Beispiel deine Programmierfähigkeiten verbesserst.

Ein Ansatz wäre der Abschied von der Einstellung "Hauptsache es funktioniert" (oft "funktioniert" so ein Code, von dem selbst der Entwickler nicht weiß, warum er funktioniert, auch nicht für alle denkbaren Fälle) hin zu der Grundhaltung: "WARUM funktioniert es eigentlich (nicht)."

Ein zweiter Ansatz wäre, dir die Verwendung von "sprechenden Bezeichnern" anzugewöhnen; teilweise gelingt das schon, überwiegend aber nicht. Wenn ein Bezeichner Informationen über seine Bedeutung enthält, dann hilft nicht nur dir das beim Verstehen des Programms.

Und: Tkinter bitte nicht gleichzeitig auf zwei verschiedene Weisen importieren!

Und: Eine Mischung aus Konsolenprogramm und GUI-Anwendung ist hässlich (sofern die Konsole nicht nur zu logging-Zwecken o.ä. genutzt wird). Die Wertetabelle könntest du auch in einem Text-Widget ausgegeben lassen oder auch in einem Canvas (letzteres sieht schöner aus, ist aber anspruchsvoller).
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Also selbst mir, als Laie der ich leider immer noch bin, fallen paar merkwürdige Dinge auf.

Das mit dem doppelten Import wurde ja bereits von numerix angesprochen.
Wobei es sogar 3 mal importiert wurde: Beitrag 3: Code-Zeile 3,4 und 53 (in der Classe).

Also der Import as ist generell zu empfehlen, diese Punkt-Notation.
Damit besteht weniger Verwechslungsgefahr, falls mal ähnliche Objekte/Classen, aus anderen Modulen, auftauchen sollten.
Den Import mit dem Stern können wir uns also schenken.

Den in Zeile 53 so weit ich weiß, auch.
Also bei einer meiner Programme, wo ich eine eigen Classe geschrieben habe, die ebenfalls Canvas und Co nutzt, reichte der Import außerhalb der Classe aus.

Da wir gerade bei Classen sind:
Ich finde es komisch, eine Classe in eine Schleife zu packen?
Verstehe den Sinn nicht ganz.
Normalerweise dient ja eine Classe dazu, um sie mit dessen Namen aufzurufen, so weit ich weiß.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

danke für die vielen tips! ich werde mal versuchen mich zu verbessern! ich freue mich echt immer wieder was dazuzulernen, da ich erst seit 1/2 Jahr angefangen habe zu programieren!
Antworten