用Python的Tkinter做一个超治愈的温馨提示弹窗管理器

该文章已生成可运行项目,

用Python的Tkinter做一个超治愈的温馨提示弹窗管理器

大家好呀!今天给大家分享一个超治愈的小项目——用Python的Tkinter库做一个温馨提示弹窗管理器。这个小工具能在屏幕上随机弹出各种暖心小贴士,每个弹窗都有不同的柔和配色,点击还能快速关闭,既有实用性又能带来好心情~话不多说,咱们直接上干货!

一、项目效果预览

运行代码后,屏幕会陆续弹出150个左右的温馨提示窗口,每个窗口:

  • 尺寸随机(220-300px宽,90-130px高)

  • 位置随机(自动避开屏幕边缘,不会溢出)

  • 背景色随机(都是超柔和的马卡龙色系)

  • 提示语随机(40+条暖心文案,比如"多喝水哦~💧"、"保持微笑呀😊")

  • 自动淡出关闭(2-4秒后慢慢消失,也可以点击直接关闭)

整体效果既不会显得杂乱,又能给桌面增添一丝温暖,适合在工作间隙给自己来点小鼓励~

二、核心代码拆解

整个项目封装在TipWindowManager类中,结构清晰,主要分为初始化配置、弹窗创建、生命周期管理三个核心部分。

1. 初始化配置(__init__方法)

这部分主要做一些基础设置,为后续弹窗创建做准备:

  • 隐藏主窗口:用self.root.withdraw()隐藏Tkinter默认的主窗口,只显示我们的提示弹窗。

  • 参数配置:设置弹窗总数(150个)、创建间隔(0.05秒)等核心参数。

  • 屏幕尺寸获取:通过winfo_screenwidth()winfo_screenheight()获取屏幕宽高,避免弹窗溢出。

  • 资源库定义:用元组存储提示语(tips)和背景色(bg_colors),元组比列表更节省内存哦~

def __init__(self):
    self.root = tk.Tk()
    self.root.withdraw()  # 隐藏主窗口
    self.active_windows = []  # 存储活跃弹窗
    self.windows_created = 0  # 已创建弹窗计数

    # 核心参数
    self.window_count = 150  # 总弹窗数
    self.create_interval = 0.05  # 创建间隔

    # 屏幕尺寸
    self.screen_width = self.root.winfo_screenwidth()
    self.screen_height = self.root.winfo_screenheight()

    # 提示语和背景色库(元组更省内存)
    self.tips = ('多喝水哦~💧', '保持微笑呀😊', ...)  # 40+条文案
    self.bg_colors = ('#FFF0F5', '#F0FFFF', ...)  # 40+种柔和颜色

2. 弹窗创建(create_random_window方法)

这是最核心的方法,负责生成单个随机弹窗,每一步都做了细节优化:

  • 弹窗基础设置:用Toplevel()创建子窗口,设置标题、随机尺寸和位置,确保窗口置顶(-topmost=True)且半透明(-alpha=0.95)。

  • 提示语标签:创建Label组件,随机选择提示语和背景色,设置合适的字体、内边距和换行方式,让文案显示更美观。

  • 自动关闭逻辑:用after()方法设置2-4秒后执行close_window函数,实现淡出效果(从0.95透明度逐渐降到0)。

  • 点击关闭:给窗口和标签绑定鼠标点击事件,点击后直接调用关闭函数,提升交互体验。

  • 异常处理:避免创建过程中出现异常导致内存泄漏,及时清理无效窗口引用。

3. 生命周期管理(check_completion和start_random_creation方法)

这部分负责管理所有弹窗的创建节奏和程序退出逻辑:

  • 创建线程:用多线程(threading)来控制弹窗创建节奏,避免阻塞UI主线程,让弹窗弹出更流畅。

  • 完成检查check_completion方法每隔0.5秒检查一次,当所有弹窗都关闭且创建完成时,退出主程序。

  • 资源清理:在main方法的finally块中,强制清理所有剩余窗口,确保程序退出时不残留资源。

三、关键技术点和优化技巧

这个小项目虽然简单,但也用到了几个实用的技术点和优化思路,值得注意:

1. 线程安全问题:Tkinter的UI操作必须在主线程执行,所以用self.root.after(0, self.create_random_window)将弹窗创建任务丢回主线程,避免线程冲突。

2. 内存优化:用元组存储静态资源、及时从active_windows列表中移除已关闭窗口、设置守护线程(daemon=True),这些都能减少内存占用。

3. 用户体验优化:弹窗半透明、柔和配色、随机位置尺寸、点击关闭和自动淡出,这些细节让工具更贴心,不会让用户觉得突兀。

四、运行方式和自定义修改

1. 直接运行

把代码保存为warm_tips.py,直接用Python运行即可:

import tkinter as tk
import random
import time
import threading


class TipWindowManager:
    """温馨提示窗口管理器"""

    def __init__(self):
        self.root = tk.Tk()
        self.root.withdraw()
        # 使用列表存储活跃窗口,避免额外数据结构占用内存
        self.active_windows = []
        self.windows_created = 0

        # 配置参数(保持核心功能,移除打印相关逻辑)
        self.window_count = 150
        self.create_interval = 0.05

        # 仅获取必要的屏幕尺寸,不存储冗余信息
        self.screen_width = self.root.winfo_screenwidth()
        self.screen_height = self.root.winfo_screenheight()

        # 提示内容与颜色库(使用元组存储,比列表更节省内存)
        self.tips = (
            '多喝水哦~💧', '保持微笑呀😊', '每天都要元气满满✨',
            '记得吃水果🍎', '保持好心情🌞', '好好爱自己❤️',
            '期待下一次见面👋', '顺顺利利🎯', '早点休息🌙',
            '愿所有烦恼都消失🌈', '别熬夜⏰', '今天过得开心嘛🎉',
            '天冷了,多穿衣服🧥', '保护眼睛哦👀',
            '深呼吸放松一下🌬️', '你真棒!🎊', '一切都会好的🌻',
            '保持积极心态⚡', '加油!🚀', '相信自己💪',
            '今天也是美好的一天🌞', '保持耐心⏳', '慢慢来比较快🐢',
            '你很特别🌟', '世界因你而美丽🌍', '放松一下🎵',
            '享受当下🎯', '感恩生活🙏', '保持好奇心🔍',
            '勇敢做自己🦁', '进步一点点📈', '温暖如春🌺',
            '心平气和🍃', '梦想成真🎠', '快乐很简单😄',
            '阳光总在风雨后🌦️', '坚持就是胜利🏆', '你是最棒的⭐',
            '生活很美好🌷', '向前看👣', '温柔待人💝',
            '珍惜当下🎁', '幸福在身边🎈'
        )

        self.bg_colors = (
            '#FFF0F5', '#F0FFFF', '#F5FFFA', '#FFF8DC', '#F0F8FF',
            '#F8F8FF', '#F5F5F5', '#FAFAD2', '#E6E6FA', '#FFE4E1',
            '#FFFAF0', '#FDF5E6', '#FAF0E6', '#FFF5EE', '#F0FFF0',
            '#F5F5DC', '#FFEFD5', '#FFE4B5', '#FAF0E6', '#F8F8FF',
            '#F0F8FF', '#E0FFFF', '#E6E6FA', '#FFF0F5', '#FFE4E1',
            '#FFFAFA', '#F5F5F5', '#F0F0F0', '#FFF8DC', '#FFE4C4',
            '#FFDAB9', '#FFEFD5', '#FFFACD', '#F0E68C', '#E6E6FA',
            '#D8BFD8', '#DDA0DD', '#EE82EE', '#DA70D6', '#FFB6C1'
        )

    def create_random_window(self):
        """随机创建一个对话框(优化内存占用:减少局部变量、及时清理无效引用)"""
        if self.windows_created >= self.window_count:
            return

        try:
            window = tk.Toplevel()
            self.active_windows.append(window)
            self.windows_created += 1

            # 随机窗口尺寸
            window_width = random.randint(220, 300)
            window_height = random.randint(90, 130)

            # 计算屏幕内随机位置,避免边界溢出
            x = random.randint(10, self.screen_width - window_width - 10)
            y = random.randint(10, self.screen_height - window_height - 10)

            # 窗口基础配置
            window.title('温馨提示')
            window.geometry(f"{window_width}x{window_height}+{x}+{y}")
            window.resizable(False, False)
            window.attributes('-topmost', True, '-alpha', 0.95)

            # 标签创建
            label = tk.Label(
                window,
                text=random.choice(self.tips),
                bg=random.choice(self.bg_colors),
                fg='#2F4F4F',
                font=('微软雅黑', random.randint(11, 13)),
                padx=18,
                pady=22,
                wraplength=window_width - 36,
                justify='center',
                relief='flat',
                bd=1
            )
            label.pack(expand=True, fill='both')

            # 关闭时间与淡出逻辑
            close_time = random.randint(2000, 4000)

            def close_window():
                if not window.winfo_exists():
                    return
                # 简化淡出循环,减少循环次数
                for alpha in range(95, 0, -15):
                    if window.winfo_exists():
                        window.attributes('-alpha', alpha / 100)
                        window.update()
                        time.sleep(0.01)
                # 关闭后立即从活跃列表移除,释放内存
                if window.winfo_exists():
                    window.destroy()
                if window in self.active_windows:
                    self.active_windows.remove(window)

            window.after(close_time, close_window)

            # 点击关闭逻辑(复用close_window,减少代码冗余)
            def on_click(event):
                close_window()

            window.bind('<Button-1>', on_click)
            label.bind('<Button-1>', on_click)

        except Exception:
            # 异常时清理无效窗口引用,避免内存泄漏
            if 'window' in locals() and window in self.active_windows:
                self.active_windows.remove(window)
                if window.winfo_exists():
                    window.destroy()

    def check_completion(self):
        """检查是否所有窗口关闭(简化判断逻辑,减少资源查询)"""
        if not self.active_windows and self.windows_created >= self.window_count:
            self.root.quit()
        else:
            self.root.after(500, self.check_completion)

    def start_random_creation(self):
        """开始随机创建窗口"""

        def create_loop():
            # 循环创建窗口,直到达到目标数量
            while self.windows_created < self.window_count:
                # 使用after确保UI操作在主线程,避免线程安全问题
                self.root.after(0, self.create_random_window)
                # 随机间隔,平衡弹出效果与性能
                time.sleep(random.uniform(0.03, 0.08))

            # 所有窗口创建完成后,启动完成检查
            self.root.after(2000, self.check_completion)

        return create_loop

    def main(self):
        """主程序(优化线程管理,确保资源正确释放)"""
        # 启动创建线程,设置守护线程确保程序退出时自动关闭
        thread = threading.Thread(target=self.start_random_creation(), daemon=True)
        thread.start()

        try:
            self.root.mainloop()
        finally:
            # 强制清理所有剩余窗口,避免内存泄漏
            for window in self.active_windows:
                try:
                    if window.winfo_exists():
                        window.destroy()
                except Exception:
                    pass
            self.root.quit()


def main():
    """主函数(简化调用,减少中间变量)"""
    TipWindowManager().main()


if __name__ == "__main__":
    main()

2. 自定义修改

如果想根据自己的喜好调整,可以修改这些参数:

  • 弹窗数量:修改self.window_count(默认150,想少点就改小)。

  • 弹窗大小:调整window_width = random.randint(220, 300)window_height = random.randint(90, 130)中的数值范围。

  • 提示语文案:在self.tips元组中添加自己喜欢的文案,比如添加"加油搬砖!💪"、"摸鱼5分钟~🐟"。

  • 背景颜色:在self.bg_colors中添加自己喜欢的十六进制颜色码(可以用PS或在线工具取色)。

五、总结

这个Tkinter温馨提示弹窗管理器虽然功能简单,但涵盖了UI创建、线程管理、内存优化等实用知识点,而且成品超治愈~适合Python初学者练手,也能作为桌面小工具给自己增添点小乐趣。

如果大家有其他有趣的扩展想法,比如添加弹窗动画、自定义弹窗形状,或者把提示语换成名言警句,都可以在评论区交流哦~最后,希望这个小工具能给大家带来好心情,咱们下次见!😊

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值