Python Tkinter计算器计算极限
我想做一个简单的计算器,有数字0-9,加,减,清除和等于的按钮。我有gui和按钮的功能,但我的计算器的计算量超过999。有什么想法吗? -如果你看第45-53行的话,我试图阻止它继续计算999 这是我的密码:Python Tkinter计算器计算极限,python,tkinter,Python,Tkinter,我想做一个简单的计算器,有数字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=B
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()
我想你是在说
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)
def等于(self):
尝试:
result=eval(self.display.get())#=1000:#我认为您希望检查小于,但不清楚,该值大于或等于
结果(计算)#结果是一个你不能做的数字5(某些参数)
#^^^^^^^^^^^这一行可能会作为错误消息结束。。。
#如果数字太大,您可能需要在此处使用其他工具来处理
其他:
提升值错误(“值太大!!!”)
除:
结果(“错误”)#不确定这条线在做什么。。。
显示。删除(0,结束)
显示。插入(0,显示)
我评论了几个问题。。。也许有一个能解决你的问题
但我认为实际上Abarnet没有解决您的问题,所以我会继续…您的大问题是,您试图用一种名为
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\u 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
完成所有这些工作。例如:
def validate_result(self, result):
if result >= 1000:
raise ValueError('result too big!')
else:
return result
@图腾:第45-53行是
equals
方法。不要说“第45-53行”,你应该说“theequals
方法”。这样我们就可以知道您在说什么,而不必将代码复制粘贴到wc
或文本编辑器中,也不必手动计数。@abarnet谢谢。我仍然不明白为什么计算999以上是不可取的因为这是他的老师强加给他的