2016-08-07 40 views
-5

Ich versuche, einen GPA-Rechner zu machen, und ich möchte das Ergebnis als float. Ich erhalte jedoch den folgenden Fehler: cannot convert string to float:...Kann nicht in float in Python 3 konvertieren

Ich suchte nach ähnlichen Lösungen auf dieser Website, fand aber auch eine, die nicht funktionierte. Es wäre hilfreich, wenn Sie mir ein paar Hinweise geben könnten.

from tkinter import * 

class gpa: 

    def __init__(self, master): 

     master.title("GPA CALCULATOR") 

     self.result = StringVar() 
     self.res = Entry(master, width = 60, textvariable = self.result) 
     self.res.grid(row = 0, column = 0, columnspan = 6,padx = 3, pady = 6, ipady = 6, sticky = "N E W S") 

     labels = '1st Semester GPA: ', '2nd Semester GPA: ','3rd Semester GPA: ','4th Semester GPA: ','5th Semester GPA: ','6th Semester GPA: ','7th Semester GPA: ','8th Semester GPA: ', 


     row = 1 
     col = 0 
     i = 1 
     for label in labels: 

      self.l = Label(master, text = label) 
      self.l.grid(row = row, column = col, sticky = E) 
      row = row + 1 






     self.var1 = StringVar() 
     self.var2 = StringVar() 
     self.var3 = StringVar() 
     self.var4 = StringVar() 
     self.var5 = StringVar() 
     self.var6 = StringVar() 
     self.var7 = StringVar() 
     self.var8 = StringVar() 


     rows = 1 
     cols = 1 

     for x in range(1, 9): 


      self.ent = Entry(master, width = 30, textvariable = 'self.var'+str(x)) 
      self.ent.grid(row = rows,pady = 6, column = cols, columnspan = 4, sticky = W) 
      rows = rows + 1 

      print('self.var' + str(x)) 



     self.button = Button(master, width = 20, text = "Calculate", command = self.calc()) 
     self.button.grid(row= 10, column = 1,columnspan = 5, sticky = E) 


    def calc(self): 

      self.val1 = float(self.var1.get()) 
      self.val2 = float(self.var2.get()) 
      self.val3 = float(self.var3.get()) 
      self.val4 = float(self.var4.get()) 
      self.val5 = float(self.var5.get()) 
      self.val6 = float(self.var6.get()) 
      self.val7 = float(self.var7.get()) 
      self.val8 = float(self.var8.get()) 

      self.add = self.val1 + self.val2 + self.val3 + self.val4 + self.val5 + self.val6 + self.val7 + self.val8/8 
      print(self.add) 

      self.result.set(self.add) 



root = Tk() 
root.configure(padx =6, pady = 12) 

run = gpa(root) 

root.mainloop() 
+0

Kann String nicht in Float konvertieren: Sorry für den falschen Titel .. – Ahmad

+0

Drucken Sie einfach self.var1.get() und die anderen am oberen Rand von calc für Debugging-Zwecke. Vielleicht sogar ihr Typ -> type (self.var1.get() ...) – sascha

+0

Ich habe das gemacht, aber der selbe Fehler wird außerhalb des Kalküls angezeigt. – Ahmad

Antwort

2

Sie Ihre StringVar ist falsch ... Einstellung

textvariable = "self.var" + str(x) 

Dies ist nur ein String. Kein Verweis auf die StringVar.

In Ihrer Funktion calc tun Sie dies:

>>> float('') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not convert string to float: 

Weil Ihr StringVar keinen „Wert“ hat - da der Verweis auf die stringvar nicht aktualisiert geben wurde es nicht richtig ist, es ist standardmäßig auf die leere Zeichenfolge festlegen.

Wenn Sie StringVar der auf diese Weise ... Es gibt ein paar Möglichkeiten, um iterativ erhalten wollte:

Verwendung __dict__: self.__dict__['var%d' % i]

Verwendung getattr: getattr(self, 'var%d' % i)

Setzen Sie sie in einer Liste/Tupel und Index entweder. Verwenden Sie einen dict-Index, obwohl imo, der seit der Verwendung von redundant ist, ihn in den Klassen-Namespace aufnehmen wird ... und Sie können einfach das obige verwenden.

Sogar richtig so Ihre StringVar der mit, dass sie Update float Umwandlung garantieren nicht, ... Sie könnten immer noch leer sein, wenn der Eintrag leer ist ...

Sie auch Ihr Befehl falsche Einstellung. command=self.calc(). Dies ist Aufruf die Funktion und Einstellung, was es den Befehl zurückgibt. Verwenden Sie command=self.calc

+0

könntest du mir bitte sagen, wie ich die "self.var" bis 8 erhöhen kann . – Ahmad

+0

Vielen Dank @Pythonista :) – Ahmad

+0

Dank bro, es hat funktioniert .. – Ahmad