温馨提示弹窗

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