tkinter 实现的简易加减法计算器 GUI 程序(05-Python实验五-2 加减法计算器.py)




这是基于 tkinter 实现的简易加减法计算器 GUI 程序,面向对象实现。 功能:提供菜单栏 + 输入框 + 按钮,支持做加法、减法计算,也可以通过菜单执行运算、退出程序。
import tkinter # 导入tkinter图形界面库
#开始定义“计算器”类
class Calculator :
# 1. 构造函数,创建Calculator实例时自动执行,搭建整个界面
def __init__(self):
myWindow = tkinter.Tk( ) # 创建主窗口对象
myWindow.geometry('240x100+400+400') #窗口大小和启动时左上角坐标
# 格式:宽x高+x坐标+y坐标;窗口宽240,高100,窗口左上角出现在屏幕(400,400)位置
myWindow.title("加减法计算器") # 设置窗口标题
# ============ 创建菜单栏部分 ============
# 增加菜单栏,绑定到窗体
menubar = tkinter.Menu(myWindow) # 创建顶级菜单栏对象
myWindow.config ( menu = menubar ) # 将菜单栏配置绑定到主窗口
# 增加第一个菜单项,下拉菜单不能移出窗口
exitMenu = tkinter.Menu( menubar, tearoff=0 )
# tearoff=0:关闭“撕下菜单”功能,下拉菜单不能脱离主窗口独立悬浮;tearoff=1可以拖拽分离菜单
# 增加下拉菜单的按钮,指定快捷键为 Alt + F,第一个字母有下划线
menubar.add_cascade( label="File(文件)", menu=exitMenu, underline=0 )
# add_cascade:创建级联下拉菜单;underline=0:第0个字符F加下划线,Alt+F可以打开这个菜单
# 在第一个级联菜单中,增加 1 个命令,指定快捷键为 Alt + Q
exitMenu.add_command( label="退出(Quit)", command=myWindow.destroy, underline=3 )
# add_command:菜单项;command=myWindow.destroy:点击就关闭销毁主窗口,退出程序
# underline=3:字符串第3个字符Q增加下划线,Alt+Q触发
# 增加第二个菜单项
operationMenu = tkinter.Menu( menubar, tearoff=0 )
menubar.add_cascade( label="运算", menu=operationMenu ) # 主菜单栏新增【运算】下拉菜单
# 在第二个级联菜单中,增加 2 个命令
operationMenu.add_command( label="加法", command=self.add ) # 菜单点加法,调用add方法
operationMenu.add_separator( ) # 下拉菜单绘制一条分隔横线,区分菜单项
operationMenu.add_command( label="减法",command=self.subtract ) #菜单点减法调用subtract
# ============ 第一块Frame:输入输出文本框区域 ============
# 输入模块的框架容器,放在窗体网格的第一行第一列,上下间隔10像素
frame1 = tkinter.Frame( myWindow ) # Frame容器,用来盛放标签Label和输入框Entry
frame1.grid ( row=1, column=1, pady=10 ) # grid网格布局:第1行第1列,上下外边距10px
# 从左到右,依次放置文字标签和文本框,把私有变量绑定到文本框
tkinter.Label( frame1, text="加数" ).pack ( side=tkinter.LEFT )
# side=tkinter.LEFT:pack布局,组件从左向右横向排列
self.v1 = tkinter.StringVar( value='0' )
# StringVar:tkinter字符串变量,专门和Entry输入框双向绑定;初始默认值'0'
tkinter.Entry( frame1, width=5, textvariable=self.v1, justify = tkinter.RIGHT ).pack ( side = tkinter.LEFT )
# Entry单行输入框;textvariable绑定字符串变量;justify=RIGHT文本靠右对齐
tkinter.Label( frame1, text="被加数" ).pack ( side=tkinter.LEFT )
self.v2 = tkinter.StringVar( value='0' )
tkinter.Entry( frame1, width=5, textvariable=self.v2, justify = tkinter.RIGHT ).pack ( side = tkinter.LEFT )
tkinter.Label( frame1, text="结果:" ).pack ( side = tkinter.LEFT )
self.v3 = tkinter.StringVar( value = '0' )
tkinter.Entry( frame1, width=5, textvariable = self.v3, justify = tkinter.RIGHT ).pack ( side = tkinter.LEFT )
# ============ 第二块Frame:功能按钮区域 ============
# 输出模块的框架容器,放在窗体网格的第二行第一列,
# sticky = tkinter.E 吸附在单元格东(右)边
frame2 = tkinter.Frame( myWindow )
frame2.grid( row = 2, column = 1, pady = 10, sticky = tkinter.E )
# 创建两个按钮,点击分别调用加法、减法函数
tkinter.Button( frame2, text = "加法", command = self.add ).pack ( side = tkinter.LEFT )
tkinter.Button( frame2, text = "减法", command = self.subtract ).pack ( side = tkinter.LEFT )
# 显示窗体,监听鼠标和键盘事件,开启GUI事件循环
myWindow.mainloop( )
# 2. 成员函数-加法
def add( self ):
# self.v1.get() 获取输入框1的字符串;eval()把字符串转为数值计算
# 相加后,self.v3.set() 将计算结果写回到绑定v3的【结果输入框】
self.v3.set ( eval ( self.v1.get( ) ) + eval ( self.v2.get( ) ) )
# 3. 成员函数-减法
def subtract( self ) :
number1 = eval ( self.v1.get( ) )
number2 = eval ( self.v2.get( ) )
self.v3.set ( number1 - number2 )
#终止定义“计算器”类
#程序入口:只有直接运行本脚本,才实例化计算器;被别的文件import导入时不会自动启动窗口
if __name__ == '__main__':
Calculator( )
🖥 运行效果
- 弹出窗口,标题:加减法计算器
- 窗口顶部菜单栏:
File(文件)、运算- File (文件) → 退出 (Quit),点击关闭程序
- 运算 → 加法 / 减法,点击菜单可以做计算
- 界面有 3 个输入框:加数、被加数、结果,默认全部显示 0
- 下方两个按钮:【加法】【减法】,点击按钮执行加减运算,结果显示在结果框
两种途径触发计算:菜单栏点击 或者 界面按钮点击,调用的是同一个函数。
📌核心知识点讲解
1. tkinter.Menu 菜单栏
add_cascade:创建下拉主菜单add_command:下拉菜单里的可点击选项add_separator():画分割线tearoff=0:禁止菜单脱离窗口;underline=n设置字符下划线,配合 Alt 快捷键myWindow.destroy():销毁窗口,结束 GUI 程序。
2. StringVar 双向绑定(重点)
self.v1 = tkinter.StringVar(value='0')
tkinter.Entry(..., textvariable=self.v1)
get():读取输入框里面的文本字符串:self.v1.get()set():往输入框写入内容:self.v3.set(结果)
Entry 输入框内容和 StringVar 变量绑定,修改变量就改变输入框,输入框输入内容也会改变变量。
3. eval() 函数
eval(字符串),把字符串当成 Python 表达式执行。 例如 eval("12") →得到数字 12。 ⚠风险:eval会执行任意代码,实际项目不推荐,教学示例使用。
4. 布局混用
grid():给 Frame 框架放在窗口上(按行、列摆放)pack(side=tkinter.LEFT):在 Frame 内部,组件从左向右横向排列。sticky=tkinter.E:East 东方向,把组件贴到网格单元格的右侧。
5. if __name__ == '__main__':
脚本直接运行,才创建计算器对象,弹出窗口;如果这个 py 文件被其他程序 import 导入,则不会自动弹出窗口。
⚠代码存在的小问题
- 如果输入框输入非数字,
eval()会直接报错,程序崩溃,没有异常处理。 eval()有安全风险,正规写法应该用float()转换,例如:
num1 = float(self.v1.get())
num2 = float(self.v2.get())
补充:按钮与菜单共用回调
按钮
command=self.add,菜单command=self.add,两者调用同一个方法,所以点按钮和点菜单效果完全一样。注意command后面不要写括号。

浙公网安备 33010602011771号