2015-01-21 4 views
-1

저는 파이썬 3에서 계산기를 가지고 있습니다. 그러나 어떤 이유로 인해 코드가 작동하지 않습니다. "="버튼을 눌러 내 일을 계산할 때까지 작동합니다 (GUI의 경우 tkinter 사용). 여기 내 코드는 때를 호출 연료 소모량으로 Coutcome의 반환 값을 전달 당신은 command = Coutcome()를 사용SyntaxError : Python 계산기 구문 분석 중에 예기치 않은 EOF


from tkinter import * 

from tkinter.ttk import * 

    def SMATH(): 

     #PUT TEXT IN ENTRY FUNCTION 

     def puttext(text): 
      sm_ent.insert(0,text) 
      return 

     #CLEAR THE ENTRY FUNCTION 

     def cleartext(): 
      sm_ent.delete(0, END) 
      return 

     #GET THE OUTCOME FUNCTION 

     def Coutcome(): 
      calc = caltext.get() 
      answer = eval(calc) 
      sm_ent = Entry(e_frame, textvariable=caltext, text=answer) 

     smathW = Tk() 
     smathW.title("Simple Math") 
     smathW.resizable(0,0) 
     smathW.wm_iconbitmap('icon.ico') 

     def quitSmath(): 
      smathW.destroy() 

     #ENTRY FRAME 
     e_frame = Frame(smathW) 
     e_frame.pack() 

     #BUTTONS FRAME 

     b_frame = Frame(smathW) 
     b_frame.pack() 

     #ENTRY 
     caltext= StringVar() 
     sm_ent = Entry(e_frame, textvariable=caltext) 
     sm_ent.pack(fill=Y) 

     #LABEL 

     sm_inf = Label(smathW, text="Here is the Simple Math mode from CalfoWin") 
     sm_inf.pack() 

     #BUTTON 7 

     sm_butt0 = Button(b_frame, text="7", command=lambda: puttext('7')) 
     sm_butt0.grid(row=1, column=0) 

     #BUTTON 8 

     sm_butt1 = Button(b_frame, text="8", command=lambda: puttext('8')) 
     sm_butt1.grid(row=1, column=1) 

     #BUTTON 9 

     sm_butt2 = Button(b_frame, text="9", command=lambda: puttext('9')) 
     sm_butt2.grid(row=1, column=2) 

     #BUTTON 4 

     sm_butt3 = Button(b_frame, text="4", command=lambda: puttext('4')) 
     sm_butt3.grid(row=2, column=0) 

     #BUTTON 5 

     sm_butt4 = Button(b_frame, text="5", command=lambda: puttext('5')) 
     sm_butt4.grid(row=2, column=1) 

     #BUTTON 6 

     sm_butt5 = Button(b_frame, text="6", command=lambda: puttext('6')) 
     sm_butt5.grid(row=2, column=2) 

     #BUTTON 1 

     sm_butt6 = Button(b_frame, text="1", command=lambda: puttext('1')) 
     sm_butt6.grid(row=3, column=0) 

     #BUTTON 2 

     sm_butt7 = Button(b_frame, text="2", command=lambda: puttext('2')) 
     sm_butt7.grid(row=3, column=1) 

     #BUTTON 3 

     sm_butt8 = Button(b_frame, text="3", command=lambda: puttext('3')) 
     sm_butt8.grid(row=3, column=2) 

     #BUTTON 0 
     sm_butt9 = Button(b_frame, text="0", command=lambda: puttext('0')) 
     sm_butt9.grid(row=4, column=0) 

     #BUTTON KOMMA 

     sm_buttKomma = Button(b_frame, text=".", command=lambda: puttext('.')) 
     sm_buttKomma.grid(row=4, column=1) 

     #BUTTON EQUALSIGN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

     sm_buttEsign = Button(b_frame, text="=", command=Coutcome()) 
     sm_buttEsign.grid(row=4, column=2) 

     #BUTTON ADDITION 

     sm_buttPlus = Button(b_frame, text="+", command=lambda: puttext('+')) 
     sm_buttPlus.grid(row=2, column=3) 

     #BUTTON SUBTRACKTION 

     sm_buttMin = Button(b_frame, text="-", command=lambda: puttext('-')) 
     sm_buttMin.grid(row=3, column=3) 

     #BUTTON DIVISION 

     sm_buttDiv = Button(b_frame, text="/", command=lambda: puttext('/')) 
     sm_buttDiv.grid(row=3, column=4) 

     #BUTTON MULTIPLICATION 

     sm_buttMult = Button(b_frame, text='x', command=lambda: puttext('*')) 
     sm_buttMult.grid(row=2, column=4) 

     #BUTTON CLEAR 

     sm_buttClear = Button(b_frame, text="Clear", command=lambda: cleartext()) 
     sm_buttClear.grid(row=1, column=3) 

     #BUTTON QUIT 

     sm_buttquit = Button(b_frame, text="Quit", command=lambda: quitSmath()) 
     sm_buttquit.grid(row=1, column=4) 
+0

유효한 파이썬 표현식을 입력 했습니까? 당신이하지 않으면 얻을 수있는 오류입니다. 아마도 그것을 잡아서 오류 메시지를 던지기를 원할 것입니다. – kindall

+0

예 그냥 수학 형식이지만 오류를 다루는 함수를 작성하는 데 기억 나게 해 주셔서 감사합니다 :) –

답변

1

(즉 죄송합니다, 아주 오래입니다, 그냥 내 코드에서 일부입니다) 버튼을 누릅니다. 이제 버튼이 생성 될 때 Coutcome이 호출되고 caltext은 여전히 ​​비어 있습니다. 즉,보고있는 오류를 제공하는 eval('')을 실행 중임을 의미합니다.

이것은 원하는 것이 아니며 버튼을 누를 때 Coutcome이 호출되기를 원합니다. 그래서 당신은 명령하여 종료하고 명확한 버튼 같은 일을해야한다, 괄호 및 람다 제거하기 위해

sm_buttEsign = Button(b_frame, text="=", command=Coutcome) 

로, 괄호없이 함수 이름을 전달해야한다. 가끔 람다를 사용해야하는 이유는 괄호를 생략해야 할 때 변수에 명령을 전달할 수 없기 때문입니다. 변수를 전달할 필요가 없으면 람다는 불필요합니다.


또한 eval을 사용해야합니다. 잘못된 입력을 사용하면 be dangerous이 될 수 있습니다. 따라서 사용자가 적절한 제한없이 eval에 물건을 입력하도록주의하십시오.

+0

안녕하세요, 당신이 말한 것을했습니다 (그리고 당신이 말한 것을 이해하고 매우 도움이되었습니다). 그러나 내 = 버튼은 여전히 ​​나던합니다 작업, 여기에 전체 오류 메시지가 있습니다 : 파이썬 REPL 프로세스가 종료되었습니다. Tkinter 콜백에서 예외가 발생했습니다. Traceback (가장 최근 호출 마지막) : 파일 "C : \ Python34 \ lib \ tkinter \ __ init__.py"파일의 1533 줄 __call__ return self.func (* args) 파일 "C : \ Users \ Ian \ Documents \ Programming \ Python 3.4.2 \ CalfoWin \ CalfoWin 데모 v0.01 \ CalfoWin 데모 v0_01.pyw", Coutcome 의 43 행 answer = eval (calc) 파일 "", 줄 0 ^ SyntaxError : 예기치 않은 구문 분석 중에 EOF –

관련 문제