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

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

文章目录

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


前言

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


一、实现功能

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

二、运行截图

1、界面
基于Python的图形化计算器(附源码)_第1张图片

2、弹窗
基于Python的图形化计算器(附源码)_第2张图片

3、logo示例
基于Python的图形化计算器(附源码)_第3张图片

三、代码示例

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('', 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('', 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('', on_enter)  # 鼠标悬浮
        button.bind('', on_leave)  # 鼠标离开

# 主循环,运行Tkinter循环
root.mainloop()

2.运行教程

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


你可能感兴趣的:(Python,python,开发语言,pycharm)