溢出预期/超时Mac OS X.

时间:2017-03-25 22:35:12

标签: macos python-3.x error-handling timeout

我有一个可以进行指数计算的计算器程序,但它不喜欢(不能处理)像10 ^ 10000000000000这样的东西。我看到上一篇文章说使用信号超时,但那只是unix。关于我的代码的另一点:当按下equals时,它通过try块运行输入,异常将ERROR打印到计算器的显示。有什么办法可以检测到潜在的溢出并在经过一段时间后引发错误或超时(引发错误)?注意:文件需要转移到另一个系统,因此解决方案必须是通用的。谢谢! 编辑:我使用python运行tkinter来制作下面的GUI。我需要将文件传输到运行Jessie的raspberry pi。

from tkinter import *
import math

    class Calc:
        def __init__(self,master):
            self.master = master

            self.lastbutton = ''

            self.varlist = dict()
            self.varlist = {"A":"0","B":"0","C":"0","D":"0","E":"0","F":"0","G":"0","H":"0","I":"0","J":"0"}
            self.dlist = dict()
            self.dlist = {'^':'**','sqrt(':'math.sqrt(',')cubrt':'**(1/3)',
             'sin(':'math.sin(','cos(':'math.cos(','tan(':'math.tan(',
             'arcsin(':'math.asin(','arccos(':'math.acos(','arctan(':'math.atan(',"τ":"(math.tau)",
             'π':'(math.pi)','e':'(math.e)',"e^":"math.exp(",'(π/2)':'((math.pi)/2)','(π/3)':'((math.pi)/3)','(π/4)':'((math.pi)/4)',
                          "A":"self.varlist['A']","B":"self.varlist['B']","C":"self.varlist['C']","D":"self.varlist['D']",
                          "E":"self.varlist['E']","F":"self.varlist['F']","G":"self.varlist['G']","H":"self.varlist['H']",
                          "I":"self.varlist['I']","J":"self.varlist['J']",
                          "mod(":"math.fmod(","e^(":"math.exp(","ln(":"math.log(","log(":"math.log10(","log b (":"math.log(",
                          "sec(":"(1/math.cos(","csc(":"(1/math.sin(","cot(":"(1/math.tan(","arcsec(":"(1/math.acos(","arccsc(":"(1/math.asin(","arccot(":"(1/math.atan(",
                          "toRadians(":"math.radians(","toDegrees":"math.degrees(","hypot(":"math.hypot("}


            self.text1 = StringVar(value = '1')
            self.text2 = StringVar(value = '2')
            self.text3 = StringVar(value = '3')
            self.text4 = StringVar(value = '4')
            self.text5 = StringVar(value = '5')
            self.text6 = StringVar(value = '6')
            self.text7 = StringVar(value = '7')
            self.text8 = StringVar(value = '8')
            self.text9 = StringVar(value = '9')
            self.text0 = StringVar(value = '0')
            self.acl = StringVar(value = 'Del')
            self.period = StringVar(value = '.')

            self.shft = StringVar(value = 'shft1')

            self.var1 = StringVar()
            self.var2 = StringVar()
            self.var3 = StringVar()

            self.option1 = ['^2','^3','sqrt(',')cubrt','^','mod(','ln(','log(','log b (']
            self.option2 = ['τ','π','e','e^','(π/2)','(π/3)','(π/4)','toRadians(','toDegrees(']
            self.option3 = ['sin(','cos(','tan(','arcsin(','arccos(','arctan(', 'sec(', 'csc(','cot(','arcsec(','arccsc(','arccot(','hypot(']

            self.master.title('My Calculator')

            self.displaya = Entry(master)
            self.displaya.grid(row = 0, columnspan = 6)
            self.displayb = Entry(master)
            self.displayb.grid(row = 1, columnspan = 6)
            self.displayc = Entry(master)
            self.displayc.grid(row = 2, columnspan = 6)


            self.one = Button(master, textvariable = self.text1,width = 10, command = lambda: self.display(self.text1.get()))
            self.one.grid(row = 4, column = 0)
            self.two = Button(master, textvariable = self.text2,width = 10, command = lambda: self.display(self.text2.get()))
            self.two.grid(row = 4, column = 1)
            self.three = Button(master, textvariable = self.text3, width = 10,command = lambda: self.display(self.text3.get()))
            self.three.grid(row = 4, column = 2)
            self.four = Button(master, textvariable = self.text4, width = 10,command = lambda: self.display(self.text4.get()))
            self.four.grid(row = 5, column = 0)
            self.five = Button(master, textvariable = self.text5,width = 10, command = lambda: self.display(self.text5.get()))
            self.five.grid(row = 5, column = 1)
            self.six = Button(master, textvariable = self.text6,width = 10, command = lambda: self.display(self.text6.get()))
            self.six.grid(row = 5, column = 2)
            self.seven = Button(master, textvariable = self.text7,width = 10, command = lambda: self.display(self.text7.get()))
            self.seven.grid(row = 6, column = 0)
            self.eight = Button(master, textvariable = self.text8, width = 10,command = lambda: self.display(self.text8.get()))
            self.eight.grid(row = 6, column = 1)
            self.nine = Button(master, textvariable = self.text9, width = 10,command = lambda: self.display(self.text9.get()))
            self.nine.grid(row = 6, column = 2)
            self.zero = Button(master, textvariable = self.text0, width = 10,command = lambda: self.display(self.text0.get()))
            self.zero.grid(row = 7, column = 1)
            self.result = Button(master, text = '=', width = 10, height = 1, command = lambda : self.equals())
            self.result.grid(row = 7, column = 0)
            self.ac = Button(master, textvariable = self.acl, width = 10, height = 1, command = lambda : self.clear(self.acl.get()))
            self.ac.grid(row = 7, column = 2)
            self.plus = Button(master, text = '+', width = 10, height = 1, command = lambda : self.display('+'))
            self.plus.grid(row = 4, column = 3)
            self.minus = Button(master, text = '-', width = 10, height = 1, command = lambda : self.display('-'))
            self.minus.grid(row = 5, column = 3)
            self.times = Button(master, text = '*', width = 10, height = 1, command = lambda : self.display('*'))
            self.times.grid(row = 6, column = 3)
            self.div = Button(master, text = '/', width = 10, height = 1, command = lambda : self.display('/'))
            self.div.grid(row = 7, column = 3)
            self.per = Button(master, textvariable = self.period, width = 4, command = lambda : self.display(self.period.get()))
            self.per.grid(row = 1, column = 0)
            self.opp = Button(master, text = '(', width = 1, height = 1, command = lambda : self.display('('))
            self.opp.grid(row = 0, column = 1)
            self.clp = Button(master, text = ')', width = 1, height = 1, command = lambda : self.display(')'))
            self.clp.grid(row = 1, column = 1)



            self.update_button = Button(master, textvariable = self.shft, width = 4, command = lambda: self.update(int(self.shft.get()[4:5])))
            self.update_button.grid(row = 0, column = 0)
            self.store = Button(master, text = 'sto', command = lambda : self.sto(self.displayc.get()))
            self.store.grid(row = 2, column = 1)

            self.menu1 = OptionMenu(master, self.var1, *self.option1)
            self.menu1.grid(row = 4, column = 4, ipadx = 20)
            self.menu2 = OptionMenu(master, self.var2, *self.option2)
            self.menu2.grid(row = 5, column = 4, ipadx = 20)
            self.menu3 = OptionMenu(master, self.var3, *self.option3)
            self.menu3.grid(row = 6, column = 4, ipadx = 20)

            self.place1 = Button(root, text = 'Place', width = 10, height = 1, command = lambda : self.display(self.var1.get()))
            self.place1.grid(row = 4, column = 5)
            self.place2 = Button(root, text = 'Place', width = 10, height = 1, command = lambda : self.display(self.var2.get()))
            self.place2.grid(row = 5, column = 5)
            self.place3 = Button(root, text = 'Place', width = 10, height = 1, command = lambda : self.display(self.var3.get()))
            self.place3.grid(row = 6, column = 5)

            self.hbox = Text(master, height = 5, width = 35)
            self.hbox.grid(row = 1, rowspan = 3, column = 4, columnspan = 2)
            self.help = Button(master, text = 'Help', command = lambda : self.hlp())
            self.help.grid(row = 2, column = 0)


        def update(self, mode):
            if mode == 1:
                self.text1.set('A')
                self.text2.set('B')
                self.text3.set('C')
                self.text4.set('D')
                self.text5.set('E')
                self.text6.set('F')
                self.text7.set('G')
                self.text8.set('H')
                self.text9.set('I')
                self.text0.set('J')
                self.acl.set('AC')
                self.period.set(',')

                self.shft.set('shft2')
            else:
                self.text1.set('1')
                self.text2.set('2')
                self.text3.set('3')
                self.text4.set('4')
                self.text5.set('5')
                self.text6.set('6')
                self.text7.set('7')
                self.text8.set('8')
                self.text9.set('9')
                self.text0.set('0')
                self.acl.set('Del')
                self.period.set('.')

                self.shft.set('shft1')

        def sto(self, dis):
            disl = dis.split(',')
            var = disl[0]
            val = disl[1]
            self.varlist[var] = val
            self.displaya.delete(0,END)
            self.displaya.insert(0, self.displayb.get())
            self.displayb.delete(0,END)
            txt = val + '-->' + var
            self.displayb.insert(0, txt)
            self.displayc.delete(0,END)
            self.displayc.insert(0, round(float(val), 7))
            self.lastbutton = 'sto('

        def hlp(self):
            self.hbox.delete(1.0, END)
            sme = dict()
            sme = {"-":"+","*":"+","/":"+","B":"A","C":"A","D":"A","E":"A","F":"A","G":"A","H":"A","I":"A","J":"A",
                   "cos(":"sin(","tan(":"sin(","arcsin(":"sin(","arccos(":"sin(","arctan(":"sin(",
                   "sec(":"sin(","csc(":"sin(","cot(":"sin(","arcsec(":"sin(","arccsc(":"sin(","arccot(":"sin("}
            bh = dict()
            bh = {"+":"+, -, *, / \n Arithmetic operators (op)\n format : x op y",
                  "sin(":"sin(), cos(), etc\n Trigonometric functions (funct()) \nformat : funct(x)",
                  "A":"Variables can hold 1 value\nat a time with STO\nuse like number",
                  "^2":"Square (exponent = 2)\n format : x^2",
                  "^":"Carrot (x ^ y)\n format : x^y",
                  ")cubrt":"Cube root\n format : (x)cubrt",
                  "sqrt(":"Square root\n format : sqrt(x)",
                  "mod(":"Modulo (remainder x/y)\nformat : mod(x,y)",
                  "ln(":"Natural log\n format : ln(x)",
                  "log(":"Log base 10\n format : log(x)",
                  "log b (":"Logarithm of base b\n format : log(x,b)",
                  "sto(":"Store value to variable\n format : sto(variable,value)",
                  "hypot(":"Hypotenuse (Pythagorean theorem)\n Find hypotenuse given two sides\n format : hypot(s1,s2)"}

            helpfunct = sme[self.lastbutton] if self.lastbutton in sme.keys() else self.lastbutton
            new = bh[helpfunct] if helpfunct in bh.keys() else "No help available for this item"
            add = 'Help:' + '\n' + new
            self.hbox.insert(1.0, add)

        def display(self,e):
            self.displayc.insert(END,e)
            self.lastbutton = e

        def equals(self):

            self.displaya.delete(0,END)
            b = self.displayb.get()
            self.displaya.insert(0, b)
            self.displayb.delete(0,END)
            c = self.displayc.get()

            for key in self.dlist:
                c = c.replace(key, self.dlist[key])

            try:
                equals = round(float(eval(c)),7)
                c = c + '=' + str(equals)
                self.displayb.insert(0, c)
                self.displayc.delete(0,END)
                self.displayc.insert(0, equals)
            except ZeroDivisionError:
                self.displayb.insert(0,c)
                c = 'Error: Div by Zero: '
                self.displayc.insert(0,c)
            except SyntaxError:
                self.displayb.insert(0,c)
                c = 'Error: Syntax'
                self.displayc.delete(0,END)
                self.displayc.insert(0,c)
            except IndexError:
                self.displayb.insert(0,c)
                c = 'Error: Syntax'
                self.displayc.delete(0,END)
                self.displayc.insert(0,c)
            except TypeError:
                self.displayb.insert(0,c)
                c = 'Error: Syntax'
                self.displayc.delete(0,END)
                self.displayc.insert(0,c)

            return
        def clear(self, com):
            if com == 'AC':
                if len(self.displayc.get()) == 0:
                    self.displayb.delete(0, END)
                    self.displaya.delete(0, END)
                else:
                    self.displayc.delete(0, END)
            else:
                self.displayc.delete(len(self.displayc.get())-1,END)
            return

    root = Tk()
    calc = Calc(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

你的特殊问题是表达式10^10000000000000(你翻译成10**10000000000000只包含整数,Python支持任意精度整数,所以它试图给你一个答案......

但是从您的代码中可以清楚地看到您正在编写浮点计算器。如果将表达式更改为10.0**10000000000000.0,则会出现即时溢出异常,请添加try:except:,然后您可以捕获并显示合适的结果。

您需要弄清楚如何在代码中添加.0。您还应该考虑如果您的用户输入了3+*4或其他垃圾,会发生什么。问问自己,使用eval是否真的是实现计算器的最佳方式。

HTH