提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
很多小伙伴的Python课程都有课程设计或大作业,基于python的具有GUI界面的简单计算器是一个既简单又美观的项目,希望能给大家一些启发。
1、从屏幕上点击按钮进行计算
2、从键盘上读取用户输入信息进行计算
3、点击运算结果一键复制
代码如下(示例):
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()
1、将名为calculator.jpg 的图片放在Python文件同一目录下
2、点击pycharm右上角运行或者命令行中输入python xxx.py即可(xxx改为你的作品名)