- 导入 Tkinter 库
- 创建主窗口
- 定义变量:用于存储当前输入的数字和计算结果。
- 创建显示区域:一个
Entry组件,用于显示输入和结果。 - 创建按钮:数字按钮 (0-9)、运算符按钮 (+, -, *, /)、功能按钮 (C, +/-, ., =)。
- 编写按钮事件处理函数:处理数字输入、运算、清除和计算等逻辑。
- 布局:使用
grid()管理器将按钮和显示区域排列整齐。
完整代码
这是完整的计算器代码,你可以直接复制并运行它。

import tkinter as tk
from tkinter import font
# --- 1. 创建主窗口 ---
window = tk.Tk()
window.title("Python Tkinter 计算器")
window.geometry("350x500") # 设置窗口大小
window.resizable(False, False) # 禁止调整窗口大小
# --- 2. 定义变量 ---
current_input = tk.StringVar()
current_input.set("0") # 初始显示为0
# --- 3. 创建显示区域 ---
display_font = font.Font(family="Helvetica", size=24)
display = tk.Entry(window, textvariable=current_input, font=display_font, bd=10, insertwidth=2, width=14, borderwidth=4, justify="right")
display.grid(row=0, column=0, columnspan=4)
# --- 4. 按钮布局和事件处理 ---
# 按钮的通用样式
button_font = font.Font(family="Helvetica", size=18)
button_style = {'font': button_font, 'width': 5, 'height': 2}
# 定义按钮的布局和对应的命令
buttons = [
('C', 1, 0, 'clear_all'), # 清除全部
('⌫', 1, 1, 'backspace'), # 退格
('±', 1, 2, 'toggle_sign'), # 正负号
('/', 1, 3, 'operator'), # 除法
('7', 2, 0, 'number'), # 数字7
('8', 2, 1, 'number'),
('9', 2, 2, 'number'),
('*', 2, 3, 'operator'), # 乘法
('4', 3, 0, 'number'), # 数字4
('5', 3, 1, 'number'),
('6', 3, 2, 'number'),
('-', 3, 3, 'operator'), # 减法
('1', 4, 0, 'number'), # 数字1
('2', 4, 1, 'number'),
('3', 4, 2, 'number'),
('+', 4, 3, 'operator'), # 加法
('0', 5, 0, 'number'), # 数字0 (占两列)
('.', 5, 2, 'decimal'), # 小数点
('=', 5, 3, 'calculate') # 等号
]
# --- 5. 创建按钮并绑定事件 ---
for (text, row, col, command_type) in buttons:
# 特殊处理数字0,让它占据两列
if text == '0':
btn = tk.Button(window, text=text, **button_style, command=lambda t=text: button_click(t))
btn.grid(row=row, column=col, columnspan=2, sticky="nsew")
else:
btn = tk.Button(window, text=text, **button_style, command=lambda t=text, cmd=command_type: button_action(t, cmd))
btn.grid(row=row, column=col, sticky="nsew")
# 让按钮可以拉伸填充空间
for i in range(5): # 5行
window.grid_rowconfigure(i, weight=1)
for i in range(4): # 4列
window.grid_columnconfigure(i, weight=1)
# --- 6. 事件处理函数 ---
def button_action(text, action_type):
"""处理所有按钮的通用逻辑"""
current_value = current_input.get()
if action_type == 'number':
# 如果当前显示是0或者是一个结果(以=,则新数字覆盖旧显示
if current_value == "0" or current_value.endswith('='):
current_input.set(text)
else:
current_input.set(current_value + text)
elif action_type == 'operator':
# 如果上一个输入是运算符,则替换它
if current_value[-1] in '+-*/':
current_input.set(current_value[:-1] + text)
else:
current_input.set(current_value + text)
elif action_type == 'decimal':
# 防止出现多个小数点
if '.' not in current_value.split()[-1].split('+')[-1].split('-')[-1].split('*')[-1].split('/')[-1]:
current_input.set(current_value + text)
elif action_type == 'clear_all':
current_input.set("0")
elif action_type == 'backspace':
if len(current_value) > 1:
current_input.set(current_value[:-1])
else:
current_input.set("0")
elif action_type == 'toggle_sign':
if current_value != "0":
if current_value.startswith('-'):
current_input.set(current_value[1:])
else:
current_input.set('-' + current_value)
elif action_type == 'calculate':
try:
# 使用 eval() 计算表达式(注意:在生产环境中使用 eval 有安全风险,但在此处作为演示是安全的)
expression = current_value
# 移除可能存在的等号
if '=' in expression:
expression = expression.split('=')[0]
result = eval(expression)
# 格式化结果,如果结果是整数则不显示小数点
if isinstance(result, int) or result.is_integer():
current_input.set(f"{int(result)}=")
else:
current_input.set(f"{result}=")
except (SyntaxError, ZeroDivisionError):
current_input.set("Error=")
# --- 7. 启动主循环 ---
window.mainloop()
代码详解
导入库和创建窗口
import tkinter as tk
from tkinter import font
window = tk.Tk()
window.title("Python Tkinter 计算器")
window.geometry("350x500")
window.resizable(False, False)
tkinter是 Python 的标准 GUI 库。font模块用于自定义字体样式,让计算器看起来更美观。tk.Tk()创建一个主窗口。)` 设置窗口标题。geometry()设置窗口的初始大小。resizable(False, False)锁定窗口大小,防止用户拉伸变形。
定义变量
current_input = tk.StringVar()
current_input.set("0")
tk.StringVar()是 Tkinter 中用于与Entry、Label等组件绑定的特殊字符串变量。- 当
current_input的值改变时,绑定了它的Entry组件会自动更新显示,这是实现界面动态更新的核心。
创建显示区域
display_font = font.Font(family="Helvetica", size=24) display = tk.Entry(window, textvariable=current_input, font=display_font, bd=10, insertwidth=2, width=14, borderwidth=4, justify="right") display.grid(row=0, column=0, columnspan=4)
tk.Entry是单行文本输入框,我们用它来显示计算器的输入和输出。textvariable=current_input:将Entry的显示内容与current_input变量绑定。font=display_font:应用我们自定义的大号字体。justify="right":文本靠右对齐,符合计算器的使用习惯。grid(row=0, column=0, columnspan=4):使用grid布局管理器,将显示区域放在第0行,跨越4列,这样它就能占据整个顶部。
按钮布局和创建
buttons = [
('C', 1, 0, 'clear_all'),
# ... 其他按钮
]
for (text, row, col, command_type) in buttons:
if text == '0':
# 0按钮特殊处理
else:
btn = tk.Button(window, text=text, **button_style, command=lambda t=text, cmd=command_type: button_action(t, cmd))
btn.grid(row=row, column=col, sticky="nsew")
- 我们使用一个列表
buttons来定义所有按钮的属性:显示文本、所在行、所在列和命令类型,这使得代码结构清晰,易于修改。 - 在循环中,我们为每个按钮创建一个
tk.Button组件。 command=...:指定按钮被点击时要执行的函数,这里我们使用了一个lambda函数,因为它可以传递参数(按钮的文本和命令类型)给button_action函数。sticky="nsew":让按钮在网格单元中拉伸,填满整个空间。window.grid_rowconfigure和window.grid_columnconfigure:让网格的行和列可以按比例拉伸,这样窗口大小变化时,按钮也能自适应。
事件处理函数 button_action
这是计算器的核心逻辑。
button_click(text): 处理数字输入,它会检查当前显示,如果显示是 "0" 或一个计算结果,就新数字覆盖,否则就在现有数字后追加。button_action(text, action_type): 处理其他所有操作。operator: 处理 , , , ,它会检查上一个字符是否也是运算符,如果是,就替换掉,避免出现连续运算符。decimal: 处理 ,它会检查当前数字部分是否已经有小数点,防止输入多个小数点。clear_all: 将显示重置为 "0"。backspace: 删除最后一个字符。toggle_sign: 切换正负号。calculate: 这是计算功能。- 它使用
eval()函数来计算字符串表达式。eval()会执行一个字符串形式的 Python 表达式。 - 注意:
eval()在处理来自不可信来源的输入时存在安全风险,因为我们的计算器所有输入都来自代码内部定义的按钮,所以这里是安全的。 - 计算后,它会将结果格式化(如果是整数就去掉
.0),并在末尾加上 号,表示计算完成。
- 它使用
如何运行代码
- 将上面的完整代码复制到一个文本编辑器中。
- 将文件保存为
calculator.py。 - 打开终端或命令提示符。
- 运行命令:
python calculator.py - 一个计算器窗口就会出现,你可以开始使用了!
这个计算器功能完整,代码结构清晰,是学习 Tkinter GUI 编程的一个非常好的实践项目。

