zoukankan      html  css  js  c++  java
  • Python之计算器

    '''
    Function:  tkinter  计算器
    '''
    import math
    import tkinter
    
    root = tkinter.Tk()
    root.resizable(width=False, height=False)
    '''hypeparameter'''
    # 是否按下了运算符
    IS_CALC = False
    # 存储数字
    STORAGE = []
    # 显示框最多显示多少个字符
    MAXSHOWLEN = 18
    # 当前显示的数字
    CurrentShow = tkinter.StringVar()
    CurrentShow.set('0')
    
    '''按下数字键(0-9)'''
    
    
    def pressNumber(number):
        global IS_CALC
        if IS_CALC:
            CurrentShow.set('0')
            IS_CALC = False
        if CurrentShow.get() == '0':
            CurrentShow.set(number)
        else:
            if len(CurrentShow.get()) < MAXSHOWLEN:
                CurrentShow.set(CurrentShow.get() + number)
    
    
    '''按下小数点'''
    
    
    def pressDP():
        global IS_CALC
        if IS_CALC:
            CurrentShow.set('0')
            IS_CALC = False
        if len(CurrentShow.get().split('.')) == 1:
            if len(CurrentShow.get()) < MAXSHOWLEN:
                CurrentShow.set(CurrentShow.get() + '.')
    
    
    '''清零'''
    
    
    def clearAll():
        global STORAGE
        global IS_CALC
        STORAGE.clear()
        IS_CALC = False
        CurrentShow.set('0')
    
    
    '''清除当前显示框内所有数字'''
    
    
    def clearCurrent():
        CurrentShow.set('0')
    
    
    '''删除显示框内最后一个数字'''
    
    
    def delOne():
        global IS_CALC
        if IS_CALC:
            CurrentShow.set('0')
            IS_CALC = False
        if CurrentShow.get() != '0':
            if len(CurrentShow.get()) > 1:
                CurrentShow.set(CurrentShow.get()[:-1])
            else:
                CurrentShow.set('0')
    
    
    '''计算答案修正'''
    
    
    def modifyResult(result):
        result = str(result)
        if len(result) > MAXSHOWLEN:
            if len(result.split('.')[0]) > MAXSHOWLEN:
                result = 'Overflow'
            else:
                # 直接舍去不考虑四舍五入问题
                result = result[:MAXSHOWLEN]
        return result
    
    
    '''按下运算符'''
    
    
    def pressOperator(operator):
        global STORAGE
        global IS_CALC
        if operator == '+/-':
            if CurrentShow.get().startswith('-'):
                CurrentShow.set(CurrentShow.get()[1:])
            else:
                CurrentShow.set('-' + CurrentShow.get())
        elif operator == '1/x':
            try:
                result = 1 / float(CurrentShow.get())
            except:
                result = 'illegal operation'
            result = modifyResult(result)
            CurrentShow.set(result)
            IS_CALC = True
        elif operator == 'sqrt':
            try:
                result = math.sqrt(float(CurrentShow.get()))
            except:
                result = 'illegal operation'
            result = modifyResult(result)
            CurrentShow.set(result)
            IS_CALC = True
        elif operator == 'MC':
            STORAGE.clear()
        elif operator == 'MR':
            if IS_CALC:
                CurrentShow.set('0')
            STORAGE.append(CurrentShow.get())
            expression = ''.join(STORAGE)
            try:
                result = eval(expression)
            except:
                result = 'illegal operation'
            result = modifyResult(result)
            CurrentShow.set(result)
            IS_CALC = True
        elif operator == 'MS':
            STORAGE.clear()
            STORAGE.append(CurrentShow.get())
        elif operator == 'M+':
            STORAGE.append(CurrentShow.get())
        elif operator == 'M-':
            if CurrentShow.get().startswith('-'):
                STORAGE.append(CurrentShow.get())
            else:
                STORAGE.append('-' + CurrentShow.get())
        elif operator in ['+', '-', '*', '/', '%']:
            STORAGE.append(CurrentShow.get())
            STORAGE.append(operator)
            IS_CALC = True
        elif operator == '=':
            if IS_CALC:
                CurrentShow.set('0')
            STORAGE.append(CurrentShow.get())
            expression = ''.join(STORAGE)
            try:
                result = eval(expression)
            # 除以0的情况
            except:
                result = 'illegal operation'
            result = modifyResult(result)
            CurrentShow.set(result)
            STORAGE.clear()
            IS_CALC = True
    
    
    '''Demo'''
    
    
    def Demo():
        root.minsize(320, 420)
        root.title('Calculator')
        # 布局
        # --文本框
        label = tkinter.Label(root, textvariable=CurrentShow, bg='black', anchor='e', bd=5, fg='white', font=('楷体', 20))
        label.place(x=20, y=50, width=280, height=50)
        # --第一行
        # ----Memory clear
        button1_1 = tkinter.Button(text='MC', bg='#666', bd=2, command=lambda: pressOperator('MC'))
        button1_1.place(x=20, y=110, width=50, height=35)
        # ----Memory read
        button1_2 = tkinter.Button(text='MR', bg='#666', bd=2, command=lambda: pressOperator('MR'))
        button1_2.place(x=77.5, y=110, width=50, height=35)
        # ----Memory save
        button1_3 = tkinter.Button(text='MS', bg='#666', bd=2, command=lambda: pressOperator('MS'))
        button1_3.place(x=135, y=110, width=50, height=35)
        # ----Memory +
        button1_4 = tkinter.Button(text='M+', bg='#666', bd=2, command=lambda: pressOperator('M+'))
        button1_4.place(x=192.5, y=110, width=50, height=35)
        # ----Memory -
        button1_5 = tkinter.Button(text='M-', bg='#666', bd=2, command=lambda: pressOperator('M-'))
        button1_5.place(x=250, y=110, width=50, height=35)
        # --第二行
        # ----删除单个数字
        button2_1 = tkinter.Button(text='del', bg='#666', bd=2, command=lambda: delOne())
        button2_1.place(x=20, y=155, width=50, height=35)
        # ----清除当前显示框内所有数字
        button2_2 = tkinter.Button(text='CE', bg='#666', bd=2, command=lambda: clearCurrent())
        button2_2.place(x=77.5, y=155, width=50, height=35)
        # ----清零(相当于重启)
        button2_3 = tkinter.Button(text='C', bg='#666', bd=2, command=lambda: clearAll())
        button2_3.place(x=135, y=155, width=50, height=35)
        # ----取反
        button2_4 = tkinter.Button(text='+/-', bg='#666', bd=2, command=lambda: pressOperator('+/-'))
        button2_4.place(x=192.5, y=155, width=50, height=35)
        # ----开根号
        button2_5 = tkinter.Button(text='sqrt', bg='#666', bd=2, command=lambda: pressOperator('sqrt'))
        button2_5.place(x=250, y=155, width=50, height=35)
        # --第三行
        # ----7
        button3_1 = tkinter.Button(text='7', bg='#bbbbbb', bd=2, command=lambda: pressNumber('7'))
        button3_1.place(x=20, y=200, width=50, height=35)
        # ----8
        button3_2 = tkinter.Button(text='8', bg='#bbbbbb', bd=2, command=lambda: pressNumber('8'))
        button3_2.place(x=77.5, y=200, width=50, height=35)
        # ----9
        button3_3 = tkinter.Button(text='9', bg='#bbbbbb', bd=2, command=lambda: pressNumber('9'))
        button3_3.place(x=135, y=200, width=50, height=35)
        # ----除
        button3_4 = tkinter.Button(text='/', bg='#708069', bd=2, command=lambda: pressOperator('/'))
        button3_4.place(x=192.5, y=200, width=50, height=35)
        # ----取余
        button3_5 = tkinter.Button(text='%', bg='#708069', bd=2, command=lambda: pressOperator('%'))
        button3_5.place(x=250, y=200, width=50, height=35)
        # --第四行
        # ----4
        button4_1 = tkinter.Button(text='4', bg='#bbbbbb', bd=2, command=lambda: pressNumber('4'))
        button4_1.place(x=20, y=245, width=50, height=35)
        # ----5
        button4_2 = tkinter.Button(text='5', bg='#bbbbbb', bd=2, command=lambda: pressNumber('5'))
        button4_2.place(x=77.5, y=245, width=50, height=35)
        # ----6
        button4_3 = tkinter.Button(text='6', bg='#bbbbbb', bd=2, command=lambda: pressNumber('6'))
        button4_3.place(x=135, y=245, width=50, height=35)
        # ----乘
        button4_4 = tkinter.Button(text='*', bg='#708069', bd=2, command=lambda: pressOperator('*'))
        button4_4.place(x=192.5, y=245, width=50, height=35)
        # ----取导数
        button4_5 = tkinter.Button(text='1/x', bg='#708069', bd=2, command=lambda: pressOperator('1/x'))
        button4_5.place(x=250, y=245, width=50, height=35)
        # --第五行
        # ----3
        button5_1 = tkinter.Button(text='3', bg='#bbbbbb', bd=2, command=lambda: pressNumber('3'))
        button5_1.place(x=20, y=290, width=50, height=35)
        # ----2
        button5_2 = tkinter.Button(text='2', bg='#bbbbbb', bd=2, command=lambda: pressNumber('2'))
        button5_2.place(x=77.5, y=290, width=50, height=35)
        # ----1
        button5_3 = tkinter.Button(text='1', bg='#bbbbbb', bd=2, command=lambda: pressNumber('1'))
        button5_3.place(x=135, y=290, width=50, height=35)
        # ----减
        button5_4 = tkinter.Button(text='-', bg='#708069', bd=2, command=lambda: pressOperator('-'))
        button5_4.place(x=192.5, y=290, width=50, height=35)
        # ----等于
        button5_5 = tkinter.Button(text='=', bg='#708069', bd=2, command=lambda: pressOperator('='))
        button5_5.place(x=250, y=290, width=50, height=80)
        # --第六行
        # ----0
        button6_1 = tkinter.Button(text='0', bg='#bbbbbb', bd=2, command=lambda: pressNumber('0'))
        button6_1.place(x=20, y=335, width=107.5, height=35)
        # ----小数点
        button6_2 = tkinter.Button(text='.', bg='#bbbbbb', bd=2, command=lambda: pressDP())
        button6_2.place(x=135, y=335, width=50, height=35)
        # ----加
        button6_3 = tkinter.Button(text='+', bg='#708069', bd=2, command=lambda: pressOperator('+'))
        button6_3.place(x=192.5, y=335, width=50, height=35)
        root.mainloop()
    
    
    if __name__ == '__main__':
        Demo()
  • 相关阅读:
    POJ 1654 Area 多边形面积 G++会WA
    POJ 3348 Cows 求凸包面积
    POJ 1279 Art Gallery 半平面交 多边形的核
    hdu 1556 Color the ball 线段树 区间更新
    POJ 1474 Video Surveillance 半平面交
    POJ 3130 How I Mathematician Wonder What You Are! 半平面交
    在React项目中,如何优雅的优化长列表
    react高亮显示关键词
    通过a标签同源和跨域下载服务器文件(基于blob)
    前端性能优化之回流和重绘
  • 原文地址:https://www.cnblogs.com/lpzpp/p/12700806.html
Copyright © 2011-2022 走看看