Python Tkinter计算器计算限制

时间:2013-12-18 22:26:58

标签: 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=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()

2 个答案:

答案 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