2016-08-07 3 views
-5

Я пытаюсь сделать калькулятор GPA, и я хочу, чтобы результат был как float. Тем не менее, я получаю следующую ошибку: cannot convert string to float:...Невозможно преобразовать строку в float в Python 3

Я искал аналогичные решения на этом сайте, но нашел тот, который не работал. Было бы полезно, если бы вы могли дать мне несколько советов.

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

Невозможно преобразовать String в float: извините за неправильный заголовок .. – Ahmad

+0

Просто распечатайте self.var1.get() и другие в верхней части calc для целей отладки. Возможно даже их тип -> тип (self.var1.get() ...) – sascha

+0

Я сделал это, но такая же ошибка показана за пределами выписки .. – Ahmad

ответ

2

Вы настраиваете ваш STRINGVAR ошибается ...

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

Это просто строка. Не ссылка на StringVar.

В вашей calc функции вы делаете это:

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

Потому что ваш STRINGVAR не имеет «значение» - поскольку ссылка на STRINGVAR не был принят правильно, это не обновляется, то по умолчанию установить на пустую строку.

Если вы хотите, чтобы итеративно получить STRINGVAR в этот путь ... Там несколько вариантов:

Использование __dict__: self.__dict__['var%d' % i]

Использование getattr: getattr(self, 'var%d' % i)

Поместите их в список/кортеж и индекс или. Используйте индекс dict, который, хотя imo является избыточным, поскольку с помощью self.* он будет находиться в пространстве имен классов ... и вы можете просто использовать приведенное выше.

Даже правильно используя свои STRINGVAR так, что они обновление не гарантируют преобразование поплавка ... Они все равно могут быть пустыми, если запись пуста ...

Вы также настроек вашей команды неправильно. command=self.calc(). Это вызывает функцию и устанавливает, что она возвращает, чтобы быть командой. Использовать command=self.calc

+0

не могли бы вы рассказать мне, как увеличить «self.var» до 8 – Ahmad

+0

Спасибо большое @Pythonista :) – Ahmad

+0

Спасибо, брату, это сработало .. – Ahmad