from tkinter import * import parser from math import factorial root = Tk() root.title("计算器") # i keeps the track of current position on the input text field i = 0 # Receives the digit as parameter and display it on the input field def get_variables(num): global i display.insert(i,num) i+=1 def clear_all(): display.delete(0,END) #add the input field display = Entry(root) display.grid(row=1,columnspan=6,sticky=N+E+S+W) def get_operation(operator): global i length = len(operator) display.insert(i,operator) i+=length #删除一个 def undo(): entire_string = display.get() if len(entire_string): new_string = entire_string[:-1] clear_all() display.insert(0,new_string) else: clear_all() display.insert(0,"Error") def calculate(): entire_string = display.get() try: a = parser.expr(entire_string).compile() result = eval(a) clear_all() display.insert(0,result) except Exception: clear_all() display.insert(0,"Error") def undo(): entire_string = display.get() if len(entire_string): new_string = entire_string[:-1] clear_all() display.insert(0,new_string) else: clear_all() display.insert(0,"Error") #Code to add buttons to the Calculator #这里click函数就与button这个插件关联了,但是不好的地方就是不能传递参数。tkinter要求由按钮(或者其它的插件) # 触发的控制器函数不能含有参数, # 目的就是为了以统一的方式去调用他们。那么我们有什么办法给函数传递参数,因为这经常会用到。答案就是使用lambda。 Button(root,text="1",command=lambda: get_variables(1)).grid(row=2,column=0,sticky=N+S+E+W) Button(root,text="2",command=lambda: get_variables(2)).grid(row=2,column=1,sticky=N+S+E+W) Button(root,text="3",command=lambda: get_variables(3)).grid(row=2,column=2,sticky=N+S+E+W) Button(root,text="4",command=lambda : get_variables(4)).grid(row=3,column=0,sticky=N+S+E+W) Button(root,text="5",command=lambda: get_variables(5)).grid(row=3,column=1,sticky=N+S+E+W) Button(root,text="6",command=lambda: get_variables(6)).grid(row=3,column=2,sticky=N+S+E+W) Button(root,text="7",command=lambda : get_variables(7)).grid(row=4,column=0,sticky=N+S+E+W) Button(root,text="8",command=lambda: get_variables(8)).grid(row=4,column=1,sticky=N+S+E+W) Button(root,text="9",command=lambda: get_variables(9)).grid(row=4,column=2,sticky=N+S+E+W) #添加清除所有按钮 Button(root,text="AC",command=lambda: clear_all()).grid(row=5,column=0,sticky=N+S+E+W) Button(root,text="0",command=lambda: get_variables(0)).grid(row=5,column=1,sticky=N+S+E+W) Button(root,text=".",command=lambda: get_variables(".")).grid(row=5,column=2,sticky=N+S+E+W) Button(root,text="+",command= lambda :get_variables("+")).grid(row=2,column=3, sticky=N+S+E+W) Button(root,text="-",command= lambda :get_operation("-")).grid(row=3,column=3, sticky=N+S+E+W) Button(root,text="*",command= lambda :get_operation("*")).grid(row=4,column=3, sticky=N+S+E+W) Button(root,text="/",command= lambda :get_operation("/")).grid(row=5,column=3, sticky=N+S+E+W) # adding new operations Button(root,text="pi",command= lambda :get_operation("*3.14")).grid(row=2,column=4, sticky=N+S+E+W) Button(root,text="%",command= lambda :get_operation("%")).grid(row=3,column=4, sticky=N+S+E+W) Button(root,text="(",command= lambda :get_operation("(")).grid(row=4,column=4, sticky=N+S+E+W) Button(root,text="exp",command= lambda :get_operation("**")).grid(row=5,column=4, sticky=N+S+E+W) Button(root,text="<-",command= lambda :undo()).grid(row=2,column=5, sticky=N+S+E+W) Button(root,text="x!", command= lambda: fact()).grid(row=3,column=5, sticky=N+S+E+W) Button(root,text=")",command= lambda :get_operation(")")).grid(row=4,column=5, sticky=N+S+E+W) Button(root,text="^2",command= lambda :get_operation("**2")).grid(row=5,column=5, sticky=N+S+E+W) Button(root,text="^2",command= lambda :get_operation("**2")).grid(row=5,column=5, sticky=N+S+E+W) Button(root,text="=",command= lambda :calculate()).grid(columnspan=6, sticky=N+S+E+W) root.mainloop()