所以我正在学习一点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()
答案 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的函数执行此操作,它将按预期工作。