import tkinter as tk
from tkinter import ttk
import math

class EnhancedCalculator:
    def __init__(self, root):
        self.root = root
        self.root.title("高级 Python 计算器")
        self.root.geometry("450x550")
        
        # 历史记录列表
        self.history = []
        self.memory = 0
        self.current_theme = "light"
        
        # 创建主框架
        self.main_frame = ttk.Frame(root)
        self.main_frame.pack(fill='both', expand=True, padx=10, pady=10)
        
        # 顶部功能区
        self.create_top_bar()
        
        # 显示框
        self.create_display()
        
        # 历史记录区域
        self.create_history_area()
        
        # 按钮区域
        self.create_buttons()
        
        # 绑定键盘事件
        self.setup_keyboard_bindings()
        
    def create_top_bar(self):
        """创建顶部功能区"""
        top_frame = ttk.Frame(self.main_frame)
        top_frame.pack(fill='x', pady=(0, 10))
        
        
        # 内存操作按钮
        ttk.Button(top_frame, text="MC", command=self.memory_clear, width=6).pack(side='left', padx=2)
        ttk.Button(top_frame, text="MR", command=self.memory_recall, width=6).pack(side='left', padx=2)
        ttk.Button(top_frame, text="M+", command=self.memory_add, width=6).pack(side='left', padx=2)
        ttk.Button(top_frame, text="M-", command=self.memory_subtract, width=6).pack(side='left', padx=2)
        
        # 清除历史按钮
        ttk.Button(top_frame, text="清空历史", command=self.clear_history, width=10).pack(side='right')
        
    def toggle_theme(self):
        """切换主题"""
        if self.current_theme == "light":
            # 切换到深色主题
            self.root.configure(bg='#2b2b2b')
            style = ttk.Style()
            
            # 创建深色主题配置
            style.configure('Dark.TFrame', background='#2b2b2b')
            style.configure('Dark.TLabelFrame', background='#2b2b2b', foreground='white')
            style.configure('Dark.TLabel', background='#2b2b2b', foreground='white')
            style.configure('Dark.TEntry', 
                           fieldbackground='#3c3c3c', 
                           foreground='white', 
                           insertcolor='white',
                           background='#2b2b2b')
            
            # 配置深色主题的按钮样式
            style.configure('Dark.TButton',
                           background='#3c3c3c',
                           foreground='white',
                           bordercolor='#555555',
                           lightcolor='#3c3c3c',
                           darkcolor='#3c3c3c')
            style.map('Dark.TButton',
                     background=[('active', '#505050')],
                     foreground=[('active', 'white')])
            
            # 应用深色样式到主框架
            self.main_frame.configure(style='Dark.TFrame')
            # 应用样式到所有可配置的子组件
    def setup_keyboard_bindings(self):
        """设置键盘绑定"""
        self.root.bind('<Key>', self.on_key_press)
        self.root.bind('<Return>', lambda e: self.calculate())
        self.root.bind('<Escape>', lambda e: self.display_var.set(''))
        self.root.bind('<BackSpace>', lambda e: self.delete_last())
    
    def on_button_click(self, value):
        """按钮点击事件处理"""
        current = self.display_var.get()
        
        if value == 'C':
            self.display_var.set('')
        elif value == '⌫':
            self.delete_last()
        elif value == '=':
            self.calculate()
        else:
            # 处理特殊函数
            if value in ['math.sin(', 'math.cos(', 'math.tan(', 'math.sqrt(',
                        'math.sinh(', 'math.cosh(', 'math.tanh(', 'math.log10(',
                        'math.log(', 'abs(', 'math.radians(', 'math.degrees(']:
                # 如果是函数，检查前面是否有数字
                if current and current[-1].isdigit():
                    self.display_var.set(current + '*' + value)
                else:
                    self.display_var.set(current + value)
            else:
                self.display_var.set(current + str(value))
    
    def on_key_press(self, event):
        """键盘按键处理"""
        if event.char.isdigit() or event.char in '+-*/.()%':
            current = self.display_var.get()
            self.display_var.set(current + event.char)
    
    def delete_last(self):
        """删除最后一个字符"""
        current = self.display_var.get()
        self.display_var.set(current[:-1])
    
    def calculate(self):
        """执行计算"""
        expression = self.display_var.get()
        if not expression:
            return
            
        try:
            # 安全检查
            allowed_chars = set('0123456789+-*/.()% abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
            if not all(char in allowed_chars for char in expression.replace('**', '')):
                self.display_var.set("错误：非法字符")
                return
            
            # 替换数学函数
            expr = expression.replace('sin(', 'math.sin(')
            expr = expr.replace('cos(', 'math.cos(')
            expr = expr.replace('tan(', 'math.tan(')
            expr = expr.replace('sqrt(', 'math.sqrt(')
            
            # 计算
            result = eval(expr, {"__builtins__": None}, {"math": math})
            
            # 格式化结果
            if isinstance(result, float) and result.is_integer():
                result = int(result)
                
            # 更新显示
            self.display_var.set(str(result))
            
            # 添加到历史记录
            self.add_to_history(f"{expression} = {result}")
        except ZeroDivisionError:
            self.display_var.set("错误：除数不能为0")
        except SyntaxError:
            self.display_var.set("错误：表达式语法错误")
        except NameError as e:
            self.display_var.set(f"错误：{str(e)}")
        except Exception as e:
            self.display_var.set(f"错误：{str(e)}")
    
    def add_to_history(self, entry):
        """添加到历史记录"""
        self.history.append(entry)
        
        # 更新历史记录显示
        self.history_text.config(state='normal')
        self.history_text.insert('end', f"• {entry}\n")
        self.history_text.see('end')
        self.history_text.config(state='disabled')
        
        # 限制历史记录数量
        if len(self.history) > 50:
            self.history.pop(0)
            self.history_text.config(state='normal')
            self.history_text.delete('1.0', '2.0')
            self.history_text.config(state='disabled')
    
    def clear_history(self):
        """清空历史记录"""
        self.history = []
        self.history_text.config(state='normal')
        self.history_text.delete('1.0', 'end')
        self.history_text.config(state='disabled')
    
    def memory_clear(self):
        """清除内存"""
        self.memory = 0
        self.memory_label.config(text=f"内存: {self.memory}")
    
    def memory_recall(self):
        """召回内存"""
        self.display_var.set(str(self.memory))
    
    def memory_add(self):
        """添加到内存"""
        try:
            value = float(self.display_var.get())
            self.memory += value
            self.memory_label.config(text=f"内存: {self.memory}")
        except:
            pass
    
    def memory_subtract(self):
        """从内存减去"""
        try:
            value = float(self.display_var.get())
            self.memory -= value
            self.memory_label.config(text=f"内存: {self.memory}")
        except:
            pass

# 测试代码
if __name__ == "__main__":
    root = tk.Tk()
    app = EnhancedCalculator(root)
    root.mainloop()