用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初学者练手,也能作为桌面小工具给自己增添点小乐趣。
如果大家有其他有趣的扩展想法,比如添加弹窗动画、自定义弹窗形状,或者把提示语换成名言警句,都可以在评论区交流哦~最后,希望这个小工具能给大家带来好心情,咱们下次见!😊
2万+

被折叠的 条评论
为什么被折叠?



