Python每日一练(计算器)

import tkinter as tk


class Calculator:
    def __init__(self, root):
        self.root = root
        self.root.title("计算器")
        self.root.geometry("300x400")
        self.root.resizable(False, False)
        self.root.configure(bg="#f0f0f0")

        # 设置字体,确保中文正常显示
        self.font = ('SimHei', 14)

        # 存储当前输入和计算结果
        self.current_expression = ""
        self.result = ""

        # 创建显示屏
        self.create_display()

        # 创建按钮
        self.create_buttons()

    def create_display(self):
        # 创建显示屏框架
        display_frame = tk.Frame(self.root, bg="#f0f0f0", height=80)
        display_frame.pack(fill=tk.BOTH, padx=10, pady=10)

        # 创建表达式显示标签
        self.expression_label = tk.Label(
            display_frame,
            text="",
            font=('SimHei', 12),
            bg="#f0f0f0",
            fg="#666666",
            anchor=tk.E
        )
        self.expression_label.pack(fill=tk.X, padx=5, pady=(5, 0))

        # 创建结果显示标签
        self.result_label = tk.Label(
            display_frame,
            text="0",
            font=self.font,
            bg="#f0f0f0",
            fg="#333333",
            anchor=tk.E
        )
        self.result_label.pack(fill=tk.X, padx=5, pady=(0, 5))

    def create_buttons(self):
        # 创建按钮框架
        buttons_frame = tk.Frame(self.root, bg="#f0f0f0")
        buttons_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        # 按钮布局
        buttons = [
            ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
            ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
            ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
            ('0', 4, 0), ('.', 4, 1), ('=', 4, 2), ('+', 4, 3),
            ('C', 0, 0), ('(', 0, 1), (')', 0, 2), ('⌫', 0, 3)
        ]

        # 创建并放置按钮
        for button_data in buttons:
            text, row, col = button_data
            button = tk.Button(
                buttons_frame,
                text=text,
                font=self.font,
                width=5,
                height=2,
                bg="#ffffff",
                fg="#333333",
                relief=tk.RAISED,
                bd=2,
                command=lambda txt=text: self.button_click(txt)
            )
            button.grid(row=row, column=col, padx=5, pady=5, sticky="nsew")

        # 设置网格权重,使按钮均匀分布
        for i in range(5):
            buttons_frame.grid_rowconfigure(i, weight=1)
        for i in range(4):
            buttons_frame.grid_columnconfigure(i, weight=1)

    def button_click(self, button_text):
        if button_text == '=':
            self.calculate()
        elif button_text == 'C':
            self.clear_all()
        elif button_text == '⌫':
            self.backspace()
        else:
            self.append_to_expression(button_text)

    def append_to_expression(self, value):
        self.current_expression += value
        self.update_display()

    def backspace(self):
        self.current_expression = self.current_expression[:-1]
        self.update_display()

    def clear_all(self):
        self.current_expression = ""
        self.result = ""
        self.update_display()

    def calculate(self):
        try:
            self.result = str(eval(self.current_expression))
            self.current_expression = self.result
        except Exception as e:
            self.result = "错误"
        finally:
            self.update_display()

    def update_display(self):
        # 更新表达式显示
        self.expression_label.config(text=self.current_expression)

        # 更新结果显示
        if self.result:
            self.result_label.config(text=self.result)
        else:
            self.result_label.config(text=self.current_expression if self.current_expression else "0")


if __name__ == "__main__":
    root = tk.Tk()
    app = Calculator(root)
    root.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值