tkinter GUI 三角形面积计算器 (05-Python实验五-3 三角形面积计算器Tkinter.py)

这是一个 tkinter GUI 三角形面积计算器。 用户输入三条边长 A、B、C;程序先判断三边能否构成三角形,如果可以,使用海伦公式计算三角形面积,显示在输入框;如果不满足三角形条件,则输出提示文字。
# 设计 GUI 图形化的面积计算器, 请用户输入三条边长,
# 判断是否能成为三角形,并求出三角形的面积。
import tkinter # 导入图形界面库,用来做窗口、按钮、输入框
import math # 导入数学库,要使用 math.sqrt()平方根函数
# 定义“计算器”类,面向对象封装整个GUI程序
class Calculator:
# 类的构造函数:创建Calculator对象的时候自动执行,搭建全部界面
def __init__(self):
myWindow = tkinter.Tk() # 创建主窗体(顶层窗口)
myWindow.title("三角形面积") # 设置窗体的标题栏文字
# tkinter的字符串绑定变量,和Entry输入框双向绑定,初始值'0'
self.v1 = tkinter.StringVar(value='0') #边长A
self.v2 = tkinter.StringVar(value='0') #边长B
self.v3 = tkinter.StringVar(value='0') #边长C
self.v4 = tkinter.StringVar(value='0') #用来存放输出结果(面积/提示文本)
# ==========第一块框架:输入三条边长的区域==========
myFrame1 = tkinter.Frame(myWindow) # Frame容器,用来盛放标签和输入框
myFrame1.grid(row=1, column=1, pady=10) # grid网格布局:放在窗口第1行第1列,上下外边距10像素
# Label文字标签 + Entry输入框,pack(side='left') 组件从左向右横向排列
tkinter.Label(myFrame1, text="边长A").pack(side='left')
tkinter.Entry(myFrame1, width=5, textvariable=self.v1, justify='right').pack(side='left')
# width=5输入框宽度;textvariable绑定StringVar;justify='right'文字靠右对齐
tkinter.Label(myFrame1, text="边长B").pack(side='left')
tkinter.Entry(myFrame1, width=5, textvariable=self.v2, justify='right').pack(side='left')
tkinter.Label(myFrame1, text="边长C").pack(side='left')
tkinter.Entry(myFrame1, width=5, textvariable=self.v3, justify='right').pack(side='left')
# ==========第二块框架:按钮与结果输出==========
myFrame2 = tkinter.Frame(myWindow)
myFrame2.grid(row=2, column=1, pady=10) # 放到窗体的2行1列,上下间隔10像素
# 创建按钮,文字“计算面积”;点击按钮触发 self.calcArea 方法
tkinter.Button(myFrame2, text="计算面积", command=self.calcArea).pack(side='left')
# 使用Entry文本框输出结果,而不用Label,好处:用户可以复制里面的文字
tkinter.Entry(myFrame2, width=20, textvariable=self.v4, justify='right').pack(side='right')
# 启动GUI事件循环,窗口显示出来,等待鼠标点击、键盘输入,关闭窗口才会结束
tkinter.mainloop()
# 计算面积,点击按钮的事件回调函数
def calcArea(self):
# .get()读取输入框的字符串;eval()把字符串转为数字
number1 = eval(self.v1.get())
number2 = eval(self.v2.get())
number3 = eval(self.v3.get())
# 判断三角形条件:任意两边之和 > 第三边
# 如果 任意两边之和 ≤ 第三边 → 不能构成三角形
if number1 + number2 <= number3 or number1 + number3 <= number2 or number3 + number2 <= number1:
self.v4.set("不是三角形,无法计算。")
else:
# --------海伦公式--------
# temp = 半周长 p = (a+b+c)/2
temp = (number1 + number2 + number3) / 2
# 面积 = √[ p(p‑a)(p‑b)(p‑c) ]
myArea = math.sqrt(temp * (temp - number1) * (temp - number2) * (temp - number3))
# set()把结果写入绑定v4的Entry输入框,必须转字符串str()
self.v4.set(str(myArea))
# 如果当前py文件直接运行,才实例化Calculator弹出窗口;被其他文件import导入时不执行
if __name__ == '__main__':
Calculator()
🖥运行效果
- 弹出窗口标题:
三角形面积 - 界面上 3 个输入框:边长 A、边长 B、边长 C,默认值都是 0
- 按钮:计算面积;右侧一个输出文本框
- 示例 1:输入
3,4,5满足三角形条件,海伦公式计算,输出6.0 - 示例 2:输入
1,2,41+2 <=4,不满足三角形,输出:不是三角形,无法计算。
📚核心知识点
1. tkinter.StringVar双向绑定
self.v1 = tkinter.StringVar(value='0')
tkinter.Entry(..., textvariable=self.v1)
self.v1.get():获取输入框的文本self.v4.set(字符串):给输出框设置显示内容
Entry 会自动同步 StringVar 变量的值。
2. 布局混用 grid + pack
myFrame1.grid(row=1,column=1):把 Frame 容器放在主窗口网格位置- Frame 内部组件使用
pack(side='left'):组件从左往右横向排布。
3. 三角形判断条件
三角形:任意两边之和大于第三边 代码写的是反面判断:只要存在一组两边之和 ≤ 第三边,就不是三角形。
if number1 + number2 <= number3 or number1 + number3 <= number2 or number3 + number2 <= number1:
4. 海伦公式
已知三边 a,b,c
- 半周长 \(p=\dfrac{a+b+c}{2}\)
- 面积 \(S=\sqrt{p(p-a)(p-b)(p-c)}\)
math.sqrt()用来求平方根。
5. command 回调
Button(..., command=self.calcArea) 点击按钮自动执行calcArea,不要加括号。
⚠代码存在的缺陷(教学重点)
eval()风险:如果输入非数字字符串,程序直接崩溃。
更安全写法替换 eval:
number1 = float(self.v1.get())
- 没有判断边长为负数的情况。例如输入
-3,4,5,负数边长本身就不合理,但代码不会拦截。 - 输出框是 Entry,用户可以手动修改输出框内容。
增加负数判断示例:
number1 = float(self.v1.get())
number2 = float(self.v2.get())
number3 = float(self.v3.get())
if number1<=0 or number2 <=0 or number3 <=0:
self.v4.set("边长不能小于等于0")
补充小提示
tkinter.mainloop() 和 myWindow.mainloop()效果完全等价。

浙公网安备 33010602011771号