Tkinter库的学习历程:设计一个计算圆面积的GUI界面

4 min read Page Views

1.问题引入

现需要设计一个计算圆面积的GUI界面,有输入框和输出框、清除按钮和计算按钮,需要判断用户输入的内容为正数,不能是负数、中英文或者其他字符,输入内容不符时,需有弹窗加以提醒。

2.python程序

import tkinter as tk
import math
from tkinter import messagebox

"""
tkinter: Tk 8.6
math: built-in (Python 3.8.10)
"""

class CircleAreaCalculator:
    def __init__(self, master):
        self.master = master
        master.title('计算圆面积')
        master.geometry('350x100')
        master.resizable(False, False)
        self.setup_ui()

    def setup_ui(self):
        """初始化用户界面组件"""
        # 输入半径部分
        self.radius_label = tk.Label(self.master, text="请输入圆半径:")
        self.radius_label.grid(row=0, column=0)
        self.radius_label.bind('<Enter>', self.change_color)
        self.radius_label.bind('<Leave>', self.back_color)
        self.radius_var = tk.StringVar(value='0')
        self.radius_entry = tk.Entry(
            self.master,
            textvariable=self.radius_var,
            width=20,
            justify=tk.RIGHT,
            selectbackground='cyan',
            selectforeground='purple',
            validate="key",
            validatecommand=(self.master.register(self.validate_input), '%P')
        )
        self.radius_entry.grid(row=0, column=1)

        # 显示面积部分
        self.area_label = tk.Label(self.master, text="圆面积为:")
        self.area_label.grid(row=1, column=0)
        self.area_label.bind('<Enter>', self.change_color)
        self.area_label.bind('<Leave>', self.back_color)
        self.area_var = tk.StringVar()
        self.area_entry = tk.Entry(
            self.master,
            textvariable=self.area_var,
            width=20,
            justify=tk.RIGHT,
            selectbackground='yellow',
            selectforeground='red'
        )
        self.area_entry.grid(row=1, column=1)

        # 按钮
        self.clear_btn = tk.Button(
            self.master,
            text="清除",
            command=self.clear_fields,
            fg='red'
        )
        self.clear_btn.place(x=75, y=60)

        self.calc_btn = tk.Button(
            self.master,
            text="计算",
            command=self.calculate,
            fg='blue'
        )
        self.calc_btn.place(x=150, y=60)

        # 图片装饰
        try:
            self.img = tk.PhotoImage(file='./图片.gif')
            tk.Label(self.master, image=self.img).place(x=250, y=10)
        except:
            pass

        # 绑定事件
        self.clear_btn.bind('<Button-1>', self.recover_calculate)

    def validate_input(self, new_value):
        """验证输入是否为有效正数"""
        try:
            if new_value == "":
                return True
            value = float(new_value)
            return value > 0
        except ValueError:
            return False

    def calculate(self):
        """计算圆面积"""
        try:
            radius = float(self.radius_var.get())
            if radius <= 0:
                messagebox.showerror("错误", "半径必须是正数")
                return
            area = math.pi * radius ** 2
            self.area_entry.delete(0, tk.END)
            self.area_entry.insert(tk.END, str(round(area, 2)))
            self.calc_btn.configure(state='disable')
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字")

    def clear_fields(self):
        """清除输入和结果"""
        self.radius_entry.delete(0, tk.END)
        self.area_entry.delete(0, tk.END)

    def recover_calculate(self, event):
        """恢复计算按钮功能"""
        event.widget = self.calc_btn.configure(state='normal')

    def change_color(self, event):
        """鼠标悬停改变标签颜色"""
        event.widget['fg'] = 'green'

    def back_color(self, event):
        """鼠标离开恢复标签颜色"""
        event.widget['fg'] = 'black'


if __name__ == "__main__":
    root = tk.Tk()
    app = CircleAreaCalculator(root)
    root.mainloop()

3.效果展示

Last updated on 2025-05-08