🌈 用 Python 写一个会“关心你”的弹窗程序

🧠 一、前言

有时候写代码写累了,总想整点“没啥用但很开心”的小东西。
于是我写了这段 Python 小脚本——
一个会随机在屏幕上弹出小窗提醒你关心自己的程序

它可能会说:

“多喝水呀
“天冷了要加衣服

“早点休息吧,别熬夜~”

看似温馨,其实是——精神攻击(×)
但从技术角度看,它是一个不错的练手项目:

  • GUI 库:tkinter
  • 随机控制:random
  • 递归与定时调用:after()
  • 窗口管理与约束:顶层窗口 Toplevel()

💬 二、运行效果

💻 运行后会发生什么?

  • 屏幕上会不断随机弹出小窗口
  • 每个窗口显示一句随机的温馨提示
  • 每个窗口颜色也随机变化
  • 默认最多弹出 300 个

🎨 效果图(示意)

8387209a10c0a489.png

🧩 三、完整代码展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import tkinter as tk
import random

# 全局计数器与配置
window_count = 0 # 当前已打开的弹窗数量
MAX_WINDOWS = 300 # 最大允许同时存在的弹窗数(保护)
POP_INTERVAL_MS = 300 # 弹窗生成间隔(毫秒)
AUTO_CLOSE_MIN = 3000 # 自动关闭最短时间(毫秒) = 3 秒
AUTO_CLOSE_MAX = 5000 # 自动关闭最长时间(毫秒) = 5 秒

# 提示语集合(温馨 + 励志 + 趣味)
TIPS = [
# 日常温馨
'多喝热水哦~', '保持微笑呀', '好好休息一下吧', '今天也要元气满满~',
'吃点水果补补维C', '天冷了,别忘了加衣服!', '喝杯热奶茶放松一下~',
'再坚持一下,马上就放假啦!', '午休时间到,眯一会儿吧', '有点困就去洗个脸,提提神~',
'别忘了多喝水!', '晚安,做个好梦', '出门记得带伞☂️', '别总对自己太苛刻啦',
'看看窗外,阳光真好呀 ☀️',

# 学习励志
'再难也要坚持,未来会感谢现在的你', '考研加油!',
'代码敲不动了?先喝口水再继续!', '写完这一页就去休息吧~',
'出错了没关系,Debug 也是成长的一部分', '你已经比昨天更厉害啦!',
'慢慢来,别急,稳一点就好', '成功不是偶然,而是坚持的结果',
'天道酬勤!继续努力!', '别怕考不完,还有我陪你~',
'自律给你自由 💪', '程序员也需要睡眠~',
'保持热爱,奔赴山海', '先搞懂这一行代码,你就赢了',
'思考中… 这也是进步的一种~',

# 趣味可爱
'嘿嘿,我又来啦~', '再看我一眼嘛 🥺', '我可是在后台默默守护你哦~',
'摸摸头,不许不开心!', '神秘力量正在给你好运 ✨',
'窗口太多啦?这是幸福的暴击!', '点我也没用,我只是个提示窗 😆',
'今天吃了什么好吃的?', '发呆也是一种小确幸~',
'给你一份虚拟拥抱 🤗', '努力的人运气都不会太差',
'加载好运中… 💫', '你笑起来真好看~', '摸鱼要适度哦~',
'心情不好就去听首歌吧~'
]

# 背景色集合
BG_COLORS = [
'lightpink', 'skyblue', 'lightgreen', 'lavender',
'lightyellow', 'plum', 'coral', 'bisque', 'aquamarine',
'mistyrose', 'honeydew', 'lavenderblush', 'oldlace'
]

def create_warm_tip():
"""
创建一个随机位置、随机颜色、随机提示语的弹窗。
弹窗会在 AUTO_CLOSE_MIN..AUTO_CLOSE_MAX 毫秒后自动关闭。
"""
global window_count

# 若已达到最大同时存在数量,则不再创建(防护)
if window_count >= MAX_WINDOWS:
return

# 创建顶层窗口(依赖 root)
window = tk.Toplevel(root)

# 标记窗口未关闭(防止重复减计数)
window._closed_flag = False

# 获取屏幕大小,用于随机定位(确保窗口完全显示)
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# 固定弹窗尺寸(你可以修改)
window_width = 250
window_height = 60

# 随机位置(保证不会超出屏幕)
x = random.randrange(0, max(1, screen_width - window_width))
y = random.randrange(0, max(1, screen_height - window_height))

# 标题与位置
window.title('温馨提示')
window.geometry(f"{window_width}x{window_height}+{x}+{y}")

# 随机提示与背景
tip = random.choice(TIPS)
bg = random.choice(BG_COLORS)

# 标签显示文本
label = tk.Label(
window,
text=tip,
bg=bg,
font=('微软雅黑', 12),
width=30,
height=3,
wraplength=230, # 如果文字太长,自动换行
justify='center'
)
label.pack(expand=True, fill='both')

# 窗口置顶
window.attributes('-topmost', True)

# 调整计数器(打开一个新窗口)
window_count += 1

# 定义关闭函数(保证计数器只被减一次)
def safe_close():
nonlocal window
global window_count
# 若已经标记为 closed,则直接返回
if getattr(window, '_closed_flag', False):
return
# 标记已关闭,防止重复执行
window._closed_flag = True
try:
window.destroy()
except Exception:
# 若 destroy 失败,也要确保计数器更新(避免卡死)
pass
# 减少计数器(下限为0)
window_count = max(0, window_count - 1)

# 如果用户手动点击窗口右上角的关闭按钮,也走 safe_close
window.protocol("WM_DELETE_WINDOW", safe_close)

# 随机一个自动关闭时间(毫秒)
auto_close_ms = random.randint(AUTO_CLOSE_MIN, AUTO_CLOSE_MAX)
# 调度自动关闭
window.after(auto_close_ms, safe_close)

def auto_pop_tips(interval=POP_INTERVAL_MS):
"""
循环调度创建弹窗(使用 root.after 实现定时递归调用)。
当 window_count 达到 MAX_WINDOWS 时会暂停创建。
"""
# 只有在未达到限制时,才继续创建
if window_count < MAX_WINDOWS:
create_warm_tip()
# 继续下一次调度
root.after(interval, auto_pop_tips, interval)
else:
print(f"已达到最大弹窗数量({MAX_WINDOWS} 个),自动暂停弹窗创建")

# 主窗口(隐藏)
root = tk.Tk()
root.withdraw()

# 启动弹窗循环(间隔 300 ms)
auto_pop_tips(POP_INTERVAL_MS)

# 运行主循环
root.mainloop()

🧠 四、代码亮点讲解

功能 技术实现
随机出现位置 random.randrange()
多窗口创建 tk.Toplevel()
自动循环弹出 root.after() 定时调用
隐藏主窗口 root.withdraw()
窗口置顶显示 window.attributes('-topmost', True)
限制最大弹窗数量 全局计数器 window_count

这段代码没啥商业价值,
但它能在无聊的夜里,提醒你:

“去喝水吧
“早点睡,不然明天又困啦

代码不止能改变世界,
也能让生活可爱一点。🌸