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()

🖥运行效果

  1. 弹出窗口标题:三角形面积
  2. 界面上 3 个输入框:边长 A、边长 B、边长 C,默认值都是 0
  3. 按钮:计算面积;右侧一个输出文本框
  • 示例 1:输入 3,4,5 满足三角形条件,海伦公式计算,输出6.0
  • 示例 2:输入 1,2,4 1+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

  1. 半周长 \(p=\dfrac{a+b+c}{2}\)
  2. 面积 \(S=\sqrt{p(p-a)(p-b)(p-c)}\) math.sqrt() 用来求平方根。

5. command 回调

Button(..., command=self.calcArea) 点击按钮自动执行calcArea,不要加括号。

⚠代码存在的缺陷(教学重点)

  1. eval()风险:如果输入非数字字符串,程序直接崩溃。

更安全写法替换 eval:number1 = float(self.v1.get())

  1. 没有判断边长为负数的情况。例如输入 -3,4,5,负数边长本身就不合理,但代码不会拦截。
  2. 输出框是 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()效果完全等价。

 

posted @ 2026-10-19 21:49  emanlee  阅读(8)  评论(0)    收藏  举报