【问题标题】:SyntaxError: unexpected EOF while parsing Python Calculator [duplicate]SyntaxError:解析Python计算器时出现意外的EOF [重复]
【发布时间】:2015-01-21 20:03:46
【问题描述】:

我在 Python 3 中有一个计算器,但由于某种原因我的代码不起作用。它工作正常,直到我按下“=”按钮来计算我的东西(使用 tkinter 作为 gui)。这是我的代码(很长,很抱歉,这只是我代码的一部分)


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)

【问题讨论】:

  • 您输入了有效的 Python 表达式吗?如果你不这样做,这正是你会得到的错误。您可能想抓住它并抛出错误消息。
  • 是的,只是输入数学,但谢谢你让我记得写一个函数来处理错误:)

标签: python tkinter calculator


【解决方案1】:

您使用command = Coutcome() 传递Coutcome 的返回值作为按下按钮时调用的函数。所以现在发生的事情是在创建按钮时调用了Coutcome,而caltext 仍然为空。这意味着您正在运行 eval(''),这会显示您所看到的错误。

这不是您想要的,您希望在按下按钮时调用Coutcome。所以你应该传递函数名,不带括号,作为命令

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

对于退出和清除按钮,您应该做同样的事情,去掉括号和 lambda。有时需要使用 lambda 的原因是因为当您必须省略括号时,您无法将变量传递给命令。当您不需要传递变量时,lambda 是多余的。


此外,您应该小心使用eval。输入错误可以be dangerous。因此,请注意让用户在没有适当限制的情况下向eval 输入内容。

【讨论】:

  • 嗨,我按照你说的做了(我理解你说的,这很有帮助)但是我的 = 按钮仍然不起作用,这是整个错误消息:Python REPL 进程已退出异常在 Tkinter 回调 Traceback 中(最近一次调用最后一次):文件“C:\Python34\lib\tkinter_init_.py”,第 1533 行,在 call 中返回 self.func( *args) 文件“C:\Users\Ian\Documents\Programming\Python 3.4.2\CalfoWin\CalfoWin Demo v0.01\CalfoWin Demo v0_01.pyw”,第 43 行,在 Coutcome answer = eval(calc) 文件“",第 0 行 ^ SyntaxError:解析时出现意外 EOF
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 2013-04-25
  • 2017-10-03
  • 1970-01-01
  • 2019-04-28
  • 2021-03-21
相关资源
最近更新 更多