我正在尝试制作一个简单的计算器,其按钮的数字为0-9,加号,减号,清除和等号。我有gui和按钮的功能,但我的计算器计算超过999.任何想法? - 如果你看45-53行,我试图阻止计算超过999。
这是我的代码:
from tkinter import *
class Calculator(Frame):
def frame(this, side):
w = Frame(this)
w.pack(side=side, expand=YES, fill=BOTH)
return w
def button(this, root, side, text, command=None):
w = Button(root, text=text, command=command)
w.pack(side=side, expand=YES, fill=BOTH)
return w
need_clr = False
def digit(self, digit):
if self.need_clr:
self.display.set('')
self.need_clr = False
self.display.set(self.display.get() + digit)
def sign(self):
need_clr = False
cont = self.display.get()
if len(cont) > 0 and cont[0] == '-':
self.display.set(cont[1:])
else:
self.display.set('-' + cont)
def oper(self, op):
self.display.set(self.display.get() + ' ' + op + ' ')
self.need_clr = False
def calc(self):
try:
self.display.set(eval(self.display.get()))
self.need_clr = True
except:
showerror('Operation Error', 'Illegal Operation')
self.display.set('')
self.need_clr = False
def equals(self):
try:
result = eval(self.display.get())
if result >= 1000:
result (calc)
except:
results("ERROR")
display.delete(0, END)
display.insert(0, display)
def __init__(self):
Frame.__init__(self)
self.option_add('*Font', 'Dotum 15')
self.pack(expand=YES, fill=BOTH)
self.master.title('Simple Calculator')
self.display = StringVar()
e = Entry(self, relief=SUNKEN, textvariable=self.display)
e.pack(side=TOP, expand=YES, fill=BOTH)
for key in ("123", "456", "789"):
keyF = self.frame(TOP)
for char in key:
self.button(keyF, LEFT, char,
lambda c=char: self.digit(c))
keyF = self.frame(TOP)
self.button(keyF, LEFT, '0', lambda ch='0': self.digit(ch))
opsF = self.frame(TOP)
for char in "+-=":
if char == '=':
btn = self.button(opsF, LEFT, char, self.calc)
else:
btn = self.button(opsF, LEFT, char,
lambda w=self, s=char: w.oper(s))
clearF = self.frame(BOTTOM)
self.button(clearF, LEFT, 'Clr', lambda w=self.display: w.set(''))
if __name__ == '__main__':
Calculator().mainloop()
答案 0 :(得分:1)
我假设你在谈论
def equals(self):
try:
result = eval(self.display.get()) # <-- this is some risky business
if result >= 1000: #I think you want to check less than but its not clear, this is greater than or equal
result (calc) #result is a number you cannot do 5(some_argument)
#^^^^^^^^^^^ this line should probably end up as an error message ...
#you probably need an else here to handle if the number is too big
else:
raise ValueError("Value Too Large!!!")
except:
results("ERROR") #not sure what this line is doing ...
display.delete(0, END)
display.insert(0, display)
我评论过几个问题......或许可以解决你的问题
但我认为真的非常麻烦地解决了你的问题,所以我会坚持下去......
答案 1 :(得分:1)
您遇到的最大问题是,您尝试在名为equals
的方法中修复此问题,而您在代码中的任何位置都不会调用它。所以,显然这不会做任何事情。
如果您查看=
按钮的定义位置,则执行以下操作:
opsF = self.frame(TOP)
for char in "+-=":
if char == '=':
btn = self.button(opsF, LEFT, char, self.calc)
因此,它调用calc
方法。你必须改变calc
来影响它的作用;添加一些永远不会被调用的完全独立的方法也无济于事。
如果你改变这个来呼叫self.equals
而不是self.calc
,那就解决了第一个问题......当然你会遇到一系列全新的问题,因为{{}中的大多数代码都是正如Joran Beasley所解释的那样,没有任何意义。查看equals
中的工作代码,作为calc
中如何执行操作的模型。
然而,比复制/粘贴/编辑equals
更好的设计是修改它以调用一些新的calc
方法,如下所示:
validate_result
现在,您只需要将def calc(self):
try:
self.display.set(self.validate_result(eval(self.display.get())))
self.need_clr = True
except:
showerror('Operation Error', 'Illegal Operation')
self.display.set('')
self.need_clr = False
写为可以处理数字的函数,并返回数字(或者如果需要,返回修改后的数字)或引发异常。它不需要复制validate_result
所做的所有工作,它可以让calc
完成所有这些工作。例如:
calc