基于Python的图形化计算器(附源码)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、实现功能
  • 二、运行截图
  • 三、代码示例
  • 1.完整代码
  • 2.运行教程

  • 前言

    很多小伙伴的Python课程都有课程设计或大作业,基于python的具有GUI界面的简单计算器是一个既简单又美观的项目,希望能给大家一些启发。


    一、实现功能

    1、从屏幕上点击按钮进行计算
    2、从键盘上读取用户输入信息进行计算
    3、点击运算结果一键复制

    二、运行截图

    1、界面

    2、弹窗

    3、logo示例
    calculator.jpg

    三、代码示例

    1.完整代码

    代码如下(示例):

    import tkinter as tk
    from tkinter import messagebox
    
    # 创建主窗口
    root = tk.Tk()
    root.title("Checo's Calculator")  #设置窗口名称
    root.geometry("430x720")  # 设置窗口大小
    
    # 尝试设置窗口图标(如果操作系统支持)
    try:
        photo = tk.PhotoImage(file='calculator.jpg')  # 将logo更换为calculator.jpg
        root.iconphoto(False, photo)
    except Exception as e:
        print(e)  # 如果无法设置图标,打印错误信息
    
    # 显示结果的变量
    result_var = tk.StringVar(value='0')  # 默认显示0
    result_history_var = tk.StringVar(value='')
    
    # 复制到剪切板的函数
    def copy_to_clipboard():
        root.clipboard_clear()  # 清除剪贴板
        root.clipboard_append(result_var.get())  # 将结果添加到剪贴板
        # 弹出已复制到剪切板的提示
        copy_popup = tk.Toplevel(root)
        copy_popup.overrideredirect(True)  # 隐藏弹窗边框
        copy_popup.geometry("+{}+{}".format(root.winfo_x() + root.winfo_width() // 2 - 70, root.winfo_y() + 30))  # 设置弹窗位置为顶部居中
        #copy_popup.attributes("-topmost", True)  # 使弹窗置顶
        copy_popup.config(bg="white")  # 修改弹窗背景颜色为白色
        copy_label = tk.Label(copy_popup, text="已复制到剪切板", font=("微软雅黑", 12), bg="white")  # 修改字体为微软雅黑、调整字体大小,并设置背景颜色为白色
        copy_label.pack(pady=10, padx=20)  # 设置内边距
        root.after(2000, copy_popup.destroy)  # 2秒后关闭弹窗
    
    # 显示屏区域
    display_frame = tk.Frame(root, height=220, bg="white")
    display_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    
    # 结果历史标签
    label_history = tk.Label(display_frame, textvariable=result_history_var, anchor='se', bg="white", fg="grey", font=("Arial", 18, "bold"))  # 修改字体
    label_history.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    
    # 当前结果标签,字体大小增大,绑定点击事件复制结果
    label_result = tk.Label(display_frame, textvariable=result_var, anchor='se', bg="white", fg="black", font=("Arial", 32, "bold"))  # 修改字体
    label_result.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    label_result.bind('<Button-1>', lambda event: copy_to_clipboard())  # 点击结果标签复制到剪切板
    
    # 按钮面板区域
    button_frame = tk.Frame(root, bg="white")
    button_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True, padx=5, pady=5)  # 设置按钮面板的外边距
    
    # 按钮布局定义,将*和/替换为×和÷
    buttons = [
        ('AC', '←', '%', '÷'),
        ('7', '8', '9', '×'),
        ('4', '5', '6', '-'),
        ('1', '2', '3', '+'),
        ('00', '0', '.', '='),
    ]
    
    # 按钮颜色定义
    button_colors = {
        'AC': '#FF6666',
        '←': '#FF6666',
        '%': '#FE9A2E',
        '÷': '#FE9A2E',
        '×': '#FE9A2E',
        '-': '#FE9A2E',
        '+': '#FE9A2E',
        '=': '#32CD32',
        '00': '#32CD32',
        '.': '#32CD32',
    }
    
    # 动画效果函数
    def on_enter(e):
        e.widget['background'] = 'grey'
    
    def on_leave(e):
        e.widget['background'] = button_colors.get(e.widget['text'], "#DDDDDD")
    
    # 按钮命令函数
    def press_button(content):
        # 根据按钮内容执行相应的操作
        if content == 'AC':  # 重置计算器
            result_var.set('0')
            result_history_var.set('')
        elif content == '←':  # 删除一个字符
            current_value = result_var.get()
            if len(current_value) > 1:
                result_var.set(current_value[:-1])
            else:
                result_var.set('0')
        elif content == '=':  # 计算表达式结果
            try:
                # 替换文本中的数学符号为Python能识别的运算符
                expression = result_history_var.get() + result_var.get()
                expression = expression.replace('×', '*').replace('÷', '/')
                # 计算结果
                result = eval(expression)
                # 根据结果类型进行格式化显示
                if isinstance(result, int) or result.is_integer():
                    result = int(result)
                else:
                    result = round(result, 8)
                result_var.set(result)
                result_history_var.set('')
            except Exception as e:
                result_var.set('error')
                result_history_var.set('')
        elif content in '×÷+-':  # 添加运算符和数字到当前表达式
            if result_var.get() != '0':  # 避免在初始0的情况下添加运算符
                result_history_var.set(result_history_var.get() + result_var.get() + content)
                result_var.set('0')
        elif content == '00':  # 添加00
            if result_var.get() != '0':  # 避免在初始0的情况下添加00
                result_var.set(result_var.get() + '00')
        elif content == '.':  # 添加小数点
            if '.' not in result_var.get():
                result_var.set(result_var.get() + '.')
        elif content == '%':  # 百分号处理
            if result_var.get() == '0':
                pass
            else:
                result_var.set(str(float(result_var.get())/100))
        else:  # 添加数字
            if result_var.get() == '0':
                result_var.set(content)
            else:
                result_var.set(result_var.get() + content)
    
    # 处理键盘输入事件
    def on_key_press(event):
        # 捕获数字、运算符、小数点、回车键和退格键的按键事件
        valid_keys = '0123456789+-*/.'
        if event.char in valid_keys or event.keysym in ['plus', 'minus', 'asterisk', 'slash']:
            press_button(event.char)
        elif event.keysym == 'Return':
            press_button('=')
        elif event.keysym == 'BackSpace':
            press_button('←')
        elif event.keysym == 'C':
            press_button('AC')
    
    # 绑定键盘
    root.bind('<KeyPress>', on_key_press)
    
    # 创建并添加按钮到按钮面板
    for row_index, row_values in enumerate(buttons):  # 循环遍历buttons列表
        button_frame.grid_rowconfigure(row_index, weight=1)  # 动态伸缩,权重相同
        for col_index, col_value in enumerate(row_values):  # 循环遍历每一行中的每个按钮值
            button_frame.grid_columnconfigure(col_index, weight=1, uniform="group1")  # 确保每一列的宽度相同
            button = tk.Button(
                button_frame,
                text=col_value,  # 设置按钮文本
                font=("Arial", 20, "bold"),  # 字体加粗
                bg=button_colors.get(col_value, "#DDDDDD"),  # 按钮背景颜色
                fg="white",  # 字体颜色
                borderwidth=0,  # 按钮边框
                highlightthickness=4,  # 高亮边框
                highlightbackground='white',  # 高亮时背景色
                highlightcolor='white',  # 高亮时的颜色
                relief='flat',  # 没有凸起或凹陷的边缘
                command=lambda value=col_value: press_button(value)  #将按钮的文本值作为参数传递给press_button函数
            )
            button.grid(row=row_index, column=col_index, sticky="nsew", padx=5, pady=5)  # 将按钮放置在网格布局中的适当位置,按钮扩展填充整个单元格,设置按钮之间的水平和垂直间距
            button.bind('<Enter>', on_enter)  # 鼠标悬浮
            button.bind('<Leave>', on_leave)  # 鼠标离开
    
    # 主循环,运行Tkinter循环
    root.mainloop()
    

    2.运行教程

    1、将名为calculator.jpg 的图片放在Python文件同一目录下
    2、点击pycharm右上角运行或者命令行中输入python xxx.py即可(xxx改为你的作品名)


    作者:糖糖的佩大师

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于Python的图形化计算器(附源码)

    发表回复