为什么我的Tkinter计算器会因此代码崩溃?

时间:2017-09-15 20:53:32

标签: python tkinter crash calculator

所以我正在学习一点Tkinter,现在我想制作一个计算器。我知道我可以用一些for循环更容易地编写代码,但这是我的问题:当我按下相等按钮时,我的程序停止运行。当我离开“输入”时,它不会崩溃。你能帮我计算一下吗?这是代码(问题已标记):

import sys
from Tkinter import *
import math

BACK_COLOR = 'grey'

def add_one():
    entry_box.insert(1000, str('1'))

def add_two():
    entry_box.insert(1000, str('2'))

def add_three():
    entry_box.insert(1000, str('3'))

def add_four():
    entry_box.insert(1000, str('4'))

def add_five():
    entry_box.insert(1000, str('5'))

def add_six():
    entry_box.insert(1000, str('6'))

def add_seven():
    entry_box.insert(1000, str('7'))

def add_eight():
    entry_box.insert(1000, str('8'))

def add_nine():
    entry_box.insert(1000, str('9'))

def add_zero():
   entry_box.insert(1000, str('0'))

def add_point():
    entry_box.insert(1000, str('.'))

def clean():
    entry_box.delete(0, 'end')

def add_pi():
    entry_box.insert(1000, str(math.pi))

def add_plus():
    entry_box.insert(1000, str('+'))

def add_minus():
    entry_box.insert(1000, str('-'))

def add_mult():
    entry_box.insert(1000, str('*'))

def add_divide():
    entry_box.insert(1000, str('/'))

def add_raise():
    entry_box.insert(1000, str('^'))

def calculate():
    #here is the problem
    i = input(entry_box.get())
    ab = int(i)
    print(str(ab))

main_window = Tk()
main_window.resizable(False, False)
main_window.geometry('354x500')
main_window.title('Calculator Alpha')
main_window.configure(background=BACK_COLOR)

#logo
label_logo = Label(main_window, text='Calculator Alpha', padx=25,pady=10, background=BACK_COLOR)
label_logo.place(x=66, y=0)
label_logo.configure(font=('BlacklightD', 18))

#entrybox
entry_box = Entry(main_window, width=51)
entry_box.place(x=20, y=50)

#bottom row
button_equal = Button(main_window, text='=', padx=30, pady=25,     command=calculate)
button_equal.place(x=277,y=430)
button_plus = Button(main_window, text='+', padx=30, pady=25,     command=add_plus)
button_plus.place(x=207,y=430)
button_pi = Button(main_window, text='Pi', padx=30, pady=25, command=add_pi)
button_pi.place(x=137,y=430)
button_zero = Button(main_window, text='0', padx=30, pady=25, command=add_zero)
button_zero.place(x=67,y=430)
button_point = Button(main_window, text='.', padx=30, pady=25,     command=add_point)
button_point.place(x=0,y=430)

#second bottom row
button_mult = Button(main_window, text='*', padx=30, pady=25,     command=add_mult)
button_mult.place(x=280, y=356)
button_minus = Button(main_window, text='-', padx=30, pady=25,     command=add_minus)
button_minus.place(x=210, y=356)
button_three = Button(main_window, text='3', padx=30, pady=25,     command=add_three)
button_three.place(x=141, y=356)
button_two = Button(main_window, text='2', padx=29, pady=25, command =     add_two)
button_two.place(x=69, y=356)
button_one = Button(main_window, text='1', padx=29, pady=25, command=add_one)
button_one.place(x=0, y=356)



#second top row
button_raise = Button(main_window, text='^', padx=30, pady=25,     command=add_raise)
button_raise.place(x=277, y=282)
button_divide = Button(main_window, text='/', padx=30, pady=25,     command=add_divide)
button_divide.place(x=210, y=282)
button_six = Button(main_window, text='6', padx=30, pady=25,     command=add_six)
button_six.place(x=141, y=282)
button_five = Button(main_window, text='5', padx=30, pady=25,     command=add_five)
button_five.place(x=67, y=282)
button_four = Button(main_window, text='4', padx=29, pady=25,     command=add_four)
button_four.place(x=0, y=282)

#top row
button_delete = Button(main_window, text='<-', padx=27, pady=25)
button_delete.place(x=278, y=208)
button_clean = Button(main_window, text='C', padx=27, pady=25, command=clean)
button_clean.place(x=213, y=208)
button_nine = Button(main_window, text='9', padx=30, pady=25,     command=add_nine)
button_nine.place(x=141, y=208)
button_eight = Button(main_window, text='8', padx=30, pady=25,     command=add_eight)
button_eight.place(x=67, y=208)
button_seven = Button(main_window, text='7', padx=29, pady=25,     command=add_seven)
button_seven.place(x=0, y=208)

main_window.mainloop()

1 个答案:

答案 0 :(得分:1)

您的问题是您编写calculate()功能的方式。

此行i = input(entry_box.get())没有按照您的想法行事。

该行正在做的是调用input()方法并将entry_box.get()的字符串结果打印到控制台并等待用户回复输入内容。该程序基本上暂停,直到您在控制台中回复。这可能是你的程序崩溃的原因。

要获取数学字符串然后计算它,可以使用eval方法。这将在数​​学兼容字符串上执行数学运算。

变化:

def calculate():
    #here is the problem
    i = input(entry_box.get())
    ab = int(i)
    print(str(ab))

要:

def calculate():
    i = entry_box.get()
    print (eval(i))

如果您希望在输入框中输入结果,则可以执行以下操作:

def calculate():
    i = entry_box.get()   
    entry_box.delete(0, END)
    entry_box.insert(0, eval(i))

另一个注意事项:

entry_box.insert(1000, str('1'))不是你应该写的。

而是使用END作为插入点。

entry_box.insert(END, str('1'))

对所有使用insert的函数执行此操作,它将按预期工作。