2014-01-19 4 views
0

Ошибка, которую я получаю, равна ValueError: invalid literal for int() with base 10: '', когда я нажимаю кнопку Десятичная на двоичную.Почему я получаю ошибку значения

Я также получаю ValueError: invalid literal for int() with base 10: 'e', когда я нажимаю кнопку Binary to Decimal.

Ниже приведен весь код, чтобы вы могли видеть, где ошибка, если она находится вне самой функции преобразования. Любая помощь в том, что мне нужно исправить, и как ее исправить, будет очень признательна.

import Tkinter 

def convertDtoB(binary,left):     
    if(left>0):         
     binary+=str(left%2)      
     return convertDtoB(binary,left//2)  
    else: 
     binary = int(binary[::-1])    
     return binary 

def convertBtoD(decimal):      
    answer = 0         
    length = len(str(decimal))     
    decimal2 = str(decimal)[::-1]    
    for i in range(length): 
     answer+=int(decimal2[i])*2**i 
    return answer 

class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     self.grid() 

     self.entryVariable = Tkinter.StringVar() 
     self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 

     self.button1 = Tkinter.Button(self, text="Convert Decimal to Binary", command=lambda: self.OnButtonClick(1)) 
     self.button1.grid(column=1,row=1) 

     self.button2 = Tkinter.Button(self, text="Convert Binary to Decimal", command=lambda: self.OnButtonClick(2)) 
     self.button2.grid(column=1,row=2) 

     self.labelVariable = Tkinter.StringVar() 
     label = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white") 
     label.grid(column=1,row=0,columnspan=2,sticky='') 
     self.labelVariable.set("Select a conversion.") 

     self.grid_columnconfigure(0,weight=1) 
     self.resizable(True,False) 
     self.update() 
     self.geometry(self.geometry()) 

    def OnButtonClick2(self, button_id): 
     if button_id == 3: 
      binaryNumber = convertDtoB("",self.decimalNumber) 
      self.labelVariable = Tkinter.StringVar() 
      label_2 = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white") 
      label_2.grid(column=1,row=0,columnspan=2,sticky='') 
      self.label_2.set(binaryNumber) 
     elif button_id == 4: 
      binaryNumber = convertBtoD(self.binaryNumber) 
      self.labelVariable = Tkinter.StringVar() 
      label_2 = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white") 
      label_2.grid(column=1,row=0,columnspan=2,sticky='') 
      self.label_2.set(binaryNumber) 

    def OnButtonClick(self, button_id): 
     if button_id == 1: 
      self.button1.destroy() 
      self.button2.destroy() 
      self.entryVariable = Tkinter.StringVar() 
      self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
      self.entry.grid(column=1,row=0,sticky='EW') 
      self.decimalNumber = self.entryVariable.set("Enter Decimal Number Here") 
      self.entry.focus_set() 
      self.entry.selection_range(0, Tkinter.END) 

      button3 = Tkinter.Button(self, text="Click here to convert", command=lambda: self.OnButtonClick(3)) 
      button3.grid(column=1,row=1) 

      self.OnButtonClick2(3) 

     elif button_id == 2: 
      self.button1.destroy() 
      self.button2.destroy() 
      self.entryVariable = Tkinter.StringVar() 
      self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
      self.entry.grid(column=1,row=0,sticky='EW') 
      self.binaryNumber = self.entryVariable.set("Enter Binary Number Here.") 
      self.entry.focus_set() 
      self.entry.selection_range(0, Tkinter.END) 

      button4 = Tkinter.Button(self, text="Click here to convert", command=lambda: self.OnButtonClick(4)) 
      button4.grid(column=1,row=1) 

      self.OnButtonClick2(4) 


if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('my application') 
app.mainloop() 
+0

Ну вы называете 'binaryNumber = convertDtoB («», self.decimalNumber)' так почему вы удивляетесь? Вы даете пустую строку в аргумент 'binary', а затем пытаетесь сделать' int (двоичный [:: - 1]) '. – BartoszKP

ответ

1

Там ряд ошибок в коде, основное это находится на линии 65 до 68, и так же на линиях 80 до 83

self.entryVariable = Tkinter.StringVar() 
    self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
    self.entry.grid(column=1,row=0,sticky='EW') 
    self.decimalNumber = self.entryVariable.set("Enter Decimal Number Here") 

здесь вы настраиваете InputBox использовать переменную self.entryVariable вместо self.decimalNumber. Метод set объекта StingVar является методом на месте и не возвращает ничего полезного (он не возвращает ни одного, как все методы inplace). Следовательно, переменная self.decimalNumber никогда не ссылается на объект StringVar. Вот код, с этим и несколько других ошибок, исправленных .. XD

def OnButtonClick2(self, button_id): 
    if button_id == 3: 
     binaryNumber = convertDtoB("",int(self.entryVariable.get())) 
     self.labelVariable = Tkinter.StringVar() 
     label_2 = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white") 
     label_2.grid(column=1,row=0,columnspan=2,sticky='') 
     self.labelVariable.set(binaryNumber) 
    elif button_id == 4: 
     binaryNumber = convertBtoD(self.entryVariable.get()) 
     self.labelVariable = Tkinter.StringVar() 
     label_2 = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white") 
     label_2.grid(column=1,row=0,columnspan=2,sticky='') 
     self.labelVariable.set(binaryNumber) 

def OnButtonClick(self, button_id): 
    if button_id == 1: 
     self.button1.destroy() 
     self.button2.destroy() 
     self.entryVariable = Tkinter.StringVar() 
     self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
     self.entry.grid(column=1,row=0,sticky='EW') 
     self.entryVariable.set("Enter Decimal Number Here") 
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

     button3 = Tkinter.Button(self, text="Click here to convert", command=lambda: self.OnButtonClick2(3)) 
     button3.grid(column=1,row=1) 

    elif button_id == 2: 
     self.button1.destroy() 
     self.button2.destroy() 
     self.entryVariable = Tkinter.StringVar() 
     self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
     self.entry.grid(column=1,row=0,sticky='EW') 
     self.entryVariable.set("Enter Binary Number Here.") 
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

     button4 = Tkinter.Button(self, text="Click here to convert", command=lambda: self.OnButtonClick2(4)) 
     button4.grid(column=1,row=1) 
+0

Большое спасибо за вашу помощь, это очень ценно. – Dan

0

Рассмотрим этот вызов

binaryNumber = convertDtoB("",self.decimalNumber) 

Это будет вызывать convertDtoB где значение decimal является пустая строка. Это будет в конечном итоге передано в int и в итоге будет оценено int(''), что приведет к ошибке, которую вы получаете.

Вам необходим либо сделать convertDtoB устойчивыми против пустых строк или изменить код вызова не миновать один

+0

Я изменил его так, чтобы convertDtoB не принимал пустую строку, но теперь я получаю ошибку: локальная переменная 'binary', на которую ссылаются перед назначением – Dan

Смежные вопросы