Python Tkinter计算器计算极限

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

我想做一个简单的计算器,有数字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()

我想你是在说

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行”,你应该说“the
equals
方法”。这样我们就可以知道您在说什么,而不必将代码复制粘贴到
wc
或文本编辑器中,也不必手动计数。@abarnet谢谢。我仍然不明白为什么计算999以上是不可取的因为这是他的老师强加给他的