Seite 1 von 1

object cannot be interpreted as an index ?

Verfasst: Freitag 26. August 2011, 16:27
von nevergod
guten tag liebe community,

Ich habe folgendes problem:
Ich schreibe zurzeit an einem bruchrechner und bekommen andauernd folgenden fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Users\Alexander\Desktop\bruchrechner\Bruchrechner_GUI.py", line 86, in rechneJimy
    self.bruch.rechne()
  File "C:\Users\Alexander\Desktop\bruchrechner\bruchrechner.py", line 20, in rechne
    Fraction((self.zaehler1),(self.nenner1))+(Fraction((self.zaehler2),(self.nenner2)))
  File "C:\Python26\lib\fractions.py", line 99, in __new__
    numerator = operator.index(numerator)
TypeError: object cannot be interpreted as an index
Dies geschieht wenn ich den berechnungsprozess einleite.

Mein code schaut wie folgt aus :

Das GUI:

Code: Alles auswählen

from Tkinter import *
from bruchrechner import *
class Bruchrechner_GUI:

    def __init__(self):
        self.bruch=bruchrechner()
        #######___Widgets erstellen anfang___####
        winow=Tk()
        self.operatorgui=StringVar()
        winow.title("Bruchrechner")
        winow.geometry("300x200")
        Hans1=Label(winow,text="Bruch 1")
        Hans2=Label(winow,text="Bruch 2")
        Hans3=Label(winow,text="Ergebnis")
        Hans4=Label(winow,font=("calibri 27 bold") ,textvariable=self.operatorgui)
        self.operatorgui.set("+")
        Hans5=Label(winow,text="=")
        self.Zahl1=DoubleVar()
        self.Zahl1.set(0)
        enZahl1=Entry(winow,width=10, textvariable=self.Zahl1)
        self.Zahl2=DoubleVar()
        self.Zahl2.set(0)
        enZahl2=Entry(winow,width=10, textvariable=self.Zahl2)
        self.Zahl3=DoubleVar()
        self.Zahl3.set(0)
        enZahl3=Entry(winow,width=10, textvariable=self.Zahl3)
        self.Zahl4=DoubleVar()
        self.Zahl4.set(0)
        enZahl4=Entry(winow,width=10, textvariable=self.Zahl4)
        self.Text1=DoubleVar()
        self.Text1.set("0")
        Hans666=Label(winow,textvariable=self.Text1)
        self.Text2=DoubleVar()
        self.Text2.set("0")
        Hans777Jacky=Label(winow,textvariable=self.Text2)
        JimsKnopf1=Button(winow,text="+",font=("calibri 17 bold") , width=2,height=1 , command=self.mplus)
        JimsKnopf2=Button(winow,text="-",font=("calibri 17 bold") ,width=2,height=1 , command=self.mminus)
        JimsKnopf3=Button(winow,text="*",font=("calibri 17 bold") ,width=2,height=1 , command=self.mmulti)
        JimsKnopf4=Button(winow,text="/",font=("calibri 17 bold") ,width=2,height=1 , command=self.mslush)
        JimsKnopf5=Button(winow,text="=",font=("calibri 17 bold"), width=2, height=1, command=self.rechneJimy)
        labrelief=Label(winow,relief=SUNKEN,width=180,height=50)
        #######___Widgets erstellen ende____#####
        #######___Widgets platzieren anfang___####
        Hans1.place(x=20, y=10)
        Hans2.place(x=130, y=10)
        Hans3.place(x=220, y=10)
        enZahl1.place(x=20, y=40)
        enZahl2.place(x=130, y=40)
        Hans666.place(x=220, y=40)
        enZahl3.place(x=20, y=70)
        enZahl4.place(x=130, y=70)
        Hans777Jacky.place(x=220, y=70)
        Hans5.place(x=200, y=54)
        Hans4.place(x=93, y=39)
        JimsKnopf1.place(x=35, y=140)
        JimsKnopf2.place(x=85, y=140)
        JimsKnopf3.place(x=135, y=140)
        JimsKnopf4.place(x=185, y=140)
        JimsKnopf5.place(x=235, y=140)
        #labrelief.place(x=0, y=149)
        



        
        
        winow.mainloop()

    def mplus(self):
        self.bruch.setoperator(1)
        self.operatorgui.set("+")
    def mminus(self):
        self.bruch.setoperator(2)
        self.operatorgui.set("-")
    def mmulti(self):
        self.bruch.setoperator(3)
        self.operatorgui.set("*")
    def mslush(self):
        self.bruch.setoperator(4)
        self.operatorgui.set("/")
    def rechneJimy(self):
        self.bruch.setzaehler1(self.Zahl1)
        self.bruch.setzaehler2(self.Zahl3)
        self.bruch.setnenner1(self.Zahl2)
        self.bruch.setnenner2(self.Zahl4)
        self.bruch.rechne()
if __name__ == '__main__':
    dasFenster = Bruchrechner_GUI()
    mainloop()    
(Bitte nicht von den Variablennamen ablenken lassen...)

Die klassendatei:

Code: Alles auswählen

from fractions import *

class bruchrechner:
    def __init__(self):
        self.op=1
    def setzaehler1(self,z1):
        self.zaehler1=z1
    def setzaehler2(self,z2):
        self.zaehler2=z2
    def setnenner1(self,n1):
        self.nenner1=n1
    def setnenner2(self,n2):
        self.nenner2=n2

    def setoperator(self,op):
        self.op=op

    def rechne(self):
        if self.op==1:
            Fraction((self.zaehler1),(self.nenner1))+(Fraction((self.zaehler2),(self.nenner2)))
            return
        elif self.op==2:
            Fraction((self.zaehler1),(self.nenner1))-(Fraction((self.zaehler2),(self.nenner2)))
            return
        elif self.op==3:
            Fraction((self.zaehler1),(self.nenner1))*(Fraction((self.zaehler2),(self.nenner2)))
            return
        else:
            Fraction((self.zaehler1),(self.nenner1))/(Fraction((self.zaehler2),(self.nenner2)))
            return
Ich stehe momentan ziehmlich auf dem schlauch weil ich ehrlich nicht weiß was diesen fehler verursacht.

hoffe man kann mir hier helfen :)

mfG. NeverGod

p.s. Ich bin mir sicher ich finde das noch herraus aber wenn mir jemand noch sagen könnte wie ich anschließend x und y aus Fraction(x,y) auslesen kann wäre ich euch sehr dankbar.

Re: object cannot be interpreted as an index ?

Verfasst: Freitag 26. August 2011, 17:31
von Darii
nevergod hat geschrieben:Ich stehe momentan ziehmlich auf dem schlauch weil ich ehrlich nicht weiß was diesen fehler verursacht.
Tipp: self.zaehler1 etc. sind keine Zahlen.
p.s. Ich bin mir sicher ich finde das noch herraus aber wenn mir jemand noch sagen könnte wie ich anschließend x und y aus Fraction(x,y) auslesen kann wäre ich euch sehr dankbar.
Ist tatsächlich nicht documentiert aber da hilft ein dir(Fraction(1,2)) wo einem numerator und denominator als Attribute ins Auge fallen.

Re: object cannot be interpreted as an index ?

Verfasst: Freitag 26. August 2011, 17:36
von nevergod
danke für den tipp, habs mal mit int(self.zaehler1) etc versucht jedoch nur den fehler "DoubleVar instance has no attribute '__trunc__'" ...
das ich noch ein totaler anfänger bin könnte das genauso auf japanisch da stehen und es würde mir genauso viel helfen.

mfG. NeverGod

Re: object cannot be interpreted as an index ?

Verfasst: Freitag 26. August 2011, 19:26
von Darii
Kurz: Die Fehlermeldung sagt aus: Geht nicht. Nur weil es int() gibt, heißt das noch lange nicht, dass man wirklich absolut alles damit in ganze Zahlen verwandeln kann.

Die Methode set hast du ja schon gefunden. Das naheliegende Äquivalent wäre get(). Sollte die Doku eigentlich hergeben.

Re: object cannot be interpreted as an index ?

Verfasst: Samstag 27. August 2011, 16:44
von nevergod
Typisch ich. Eine sache die ich ganz am anfang gelernt habe aber zu blöd bin um mich daran zu erinnern. Viele dank! er nimmt nun alle variablen an.

jedoch bin ich immernoch ratlos wie ich nun aus der def berechne(self): die am ende ja ein return zähler und nenner ausleen soll.

ich habe das mal in einer variable zwischenspeichern lassen und das ergebnis printen lassen und es gibt nun anstatt fraction(x,y) x/y
zurück. :S :K Darum bin ich mehr oder weniger verwirrt wie man nun x und y einzeln auslesen kann.

mfG. Nevergod

Re: object cannot be interpreted as an index ?

Verfasst: Samstag 27. August 2011, 17:47
von Darii
Habe ich doch schon geschrieben .numerator und .denumerator

Re: object cannot be interpreted as an index ?

Verfasst: Sonntag 28. August 2011, 21:49
von nevergod
ah ja natürlich :mrgreen: tut mir leid war wegen dem output ohne fractions davor etwas verwirrt
alles funktioniert nun wie es sollte
Vielen dank für die schnellen antworten, wie immer top support hier :D

mfG. NeverGod