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