您的当前位置:首页正文

Python tkinter制作简易计算器

2024-11-28 来源:个人技术集锦

python版本3.9

import tkinter as tk

# 自定义异常类
class OperatorError(Exception):
    def __init__(self, count, maxcount):
        self.count = count
        self.maxcount = maxcount


HEIGHT = 400
WIDTH = 400
root = tk.Tk()
root.title('简易计算器')
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()


def callback(screen, number):
    screen.insert('end', number)


def tips(tip, s):
    tip.insert('end', s)


def clear(screen, tip):
    tip.delete(0, 'end')
    screen.delete(0, 'end')


def equal(screen):
    try:
        input = screen.get()
        expression = input.strip()
        sum = expression.count('+') + expression.count('-') + expression.count('*') + expression.count('/')
        if sum >= 2:
            raise OperatorError(sum, 1)
        output = str(eval(expression))
        clear(screen, tip)
        screen.insert('end', output)
    except OperatorError as e:
        tips(tip, "Error: 表达式中不能包含多于一个的运算符")
    except SyntaxError as e:
        tips(tip, "Error: 一个数字中,不能包含多于一个的小数点")


frame = tk.Frame(root, bg='#ADD8E6', bd=8)
frame.place(relx=0, rely=0, relwidth=1, relheight=0.15)

frame1 = tk.Frame(root, bd=8)
frame1.place(relx=0, rely=0.2, relwidth=1, relheight=0.8)

frame2 = tk.Frame(root)
frame2.place(relx=0, rely=0.15, relwidth=1, relheight=0.05)

# 创建显示计算区
screen = tk.Entry(frame, justify='right')
screen.place(relwidth=1, relheight=1)

# 创建显示错误区
tip = tk.Entry(frame2, justify='right')
tip.place(relwidth=1, relheight=1)

ButtonC = tk.Button(frame1, text="C", command=lambda: clear(screen, tip))
ButtonC.place(relx=0.025, rely=0.025, relwidth=0.2, relheight=0.2)

Button7 = tk.Button(frame1, text="7", command=lambda: callback(screen, '7'))
Button7.place(relx=0.025, rely=0.275, relwidth=0.2, relheight=0.2)

Button4 = tk.Button(frame1, text="4", command=lambda: callback(screen, '4'))
Button4.place(relx=0.025, rely=0.525, relwidth=0.2, relheight=0.2)

Button1 = tk.Button(frame1, text="1", command=lambda: callback(screen, '1'))
Button1.place(relx=0.025, rely=0.775, relwidth=0.2, relheight=0.2)

Buttonadd = tk.Button(frame1, text="+", command=lambda: callback(screen, '+'))
Buttonadd.place(relx=0.275, rely=0.025, relwidth=0.2, relheight=0.2)

Button8 = tk.Button(frame1, text="8", command=lambda: callback(screen, '8'))
Button8.place(relx=0.275, rely=0.275, relwidth=0.2, relheight=0.2)

Button5 = tk.Button(frame1, text="5", command=lambda: callback(screen, '5'))
Button5.place(relx=0.275, rely=0.525, relwidth=0.2, relheight=0.2)

Button2 = tk.Button(frame1, text="2", command=lambda: callback(screen, '2'))
Button2.place(relx=0.275, rely=0.775, relwidth=0.2, relheight=0.2)

Buttonsub = tk.Button(frame1, text="-", command=lambda: callback(screen, '-'))
Buttonsub.place(relx=0.525, rely=0.025, relwidth=0.2, relheight=0.2)

Button9 = tk.Button(frame1, text="9", command=lambda: callback(screen, '9'))
Button9.place(relx=0.525, rely=0.275, relwidth=0.2, relheight=0.2)

Button6 = tk.Button(frame1, text="6", command=lambda: callback(screen, '6'))
Button6.place(relx=0.525, rely=0.525, relwidth=0.2, relheight=0.2)

Button3 = tk.Button(frame1, text="3", command=lambda: callback(screen, '3'))
Button3.place(relx=0.525, rely=0.775, relwidth=0.2, relheight=0.2)

Buttonmul = tk.Button(frame1, text="*", command=lambda: callback(screen, '*'))
Buttonmul.place(relx=0.775, rely=0.025, relwidth=0.2, relheight=0.2)

Buttondiv = tk.Button(frame1, text="/", command=lambda: callback(screen, '/'))
Buttondiv.place(relx=0.775, rely=0.275, relwidth=0.2, relheight=0.2)

Buttonequ = tk.Button(frame1, text="=", command=lambda: equal(screen))
Buttonequ.place(relx=0.775, rely=0.525, relwidth=0.2, relheight=0.2)

ButtonC1 = tk.Button(frame1, text="C", command=lambda: clear(screen, tip))
ButtonC1.place(relx=0.775, rely=0.775, relwidth=0.2, relheight=0.2)

root.mainloop()


结果:

显示全文