Python?Tkinter實(shí)現(xiàn)滿(mǎn)屏隨機(jī)彈出溫馨提示對(duì)話(huà)框完整代碼
前言
今天我要分享一個(gè)有趣的 Python 項(xiàng)目——使用 Tkinter 創(chuàng)建滿(mǎn)屏隨機(jī)彈出的溫馨提示對(duì)話(huà)框。這個(gè)項(xiàng)目結(jié)合了 GUI 編程、多線(xiàn)程和動(dòng)畫(huà)效果,最終實(shí)現(xiàn)了一個(gè)視覺(jué)上很吸引人的效果。
項(xiàng)目效果
運(yùn)行程序后,你會(huì)看到無(wú)數(shù)個(gè)小小的對(duì)話(huà)框隨機(jī)從屏幕各處跳出來(lái),每個(gè)對(duì)話(huà)框都顯示著不同的溫馨話(huà)語(yǔ),比如"多喝水哦~??"、"保持微笑呀??"等。這些對(duì)話(huà)框以柔和的顏色顯示,在屏幕上停留2-4秒后自動(dòng)消失,點(diǎn)擊任意對(duì)話(huà)框可以立即關(guān)閉。

完整代碼
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
# 配置參數(shù)
self.window_count = 150 # 窗口數(shù)量
self.batch_size = 1 # 每次只創(chuàng)建一個(gè),實(shí)現(xiàn)隨機(jī)跳出效果
self.create_interval = 0.05 # 創(chuàng)建間隔
# 獲取屏幕尺寸
self.screen_width = self.root.winfo_screenwidth()
self.screen_height = self.root.winfo_screenheight()
print(f"??? 屏幕尺寸: {self.screen_width} x {self.screen_height}")
# 豐富的提示內(nèi)容庫(kù)
self.tips = [
'多喝水哦~??', '保持微笑呀??', '每天都要元?dú)鉂M(mǎn)滿(mǎn)?',
'記得吃水果??', '保持好心情??', '好好愛(ài)自己??',
'期待下一次見(jiàn)面??', '順順利利??', '早點(diǎn)休息??',
'愿所有煩惱都消失??', '別熬夜?', '今天過(guò)得開(kāi)心嘛??',
'天冷了,多穿衣服??', '保護(hù)眼睛哦??',
'深呼吸放松一下???', '你真棒!??', '一切都會(huì)好的??',
'保持積極心態(tài)?', '加油!??',
'相信自己??', '今天也是美好的一天??', '保持耐心?',
'慢慢來(lái)比較快??', '你很特別??', '世界因你而美麗??',
'放松一下??', '享受當(dāng)下??', '感恩生活??',
'保持好奇心??', '勇敢做自己??', '進(jìn)步一點(diǎn)點(diǎn)??',
'溫暖如春??', '心平氣和??', '夢(mèng)想成真??',
'快樂(lè)很簡(jiǎn)單??', '陽(yáng)光總在風(fēng)雨后???', '堅(jiān)持就是勝利??',
'你是最棒的?', '生活很美好??', '向前看??',
'溫柔待人??', '珍惜當(dāng)下??', '幸福在身邊??'
]
# 柔和的背景顏色庫(kù)
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):
"""隨機(jī)創(chuàng)建一個(gè)對(duì)話(huà)框"""
if self.windows_created >= self.window_count:
return
try:
window = tk.Toplevel()
self.active_windows.append(window)
self.windows_created += 1
# 隨機(jī)窗口尺寸
window_width = random.randint(220, 300)
window_height = random.randint(90, 130)
# 完全隨機(jī)位置 - 確保在屏幕內(nèi)
x = random.randint(10, max(20, self.screen_width - window_width - 10))
y = random.randint(10, max(20, self.screen_height - window_height - 10))
# 對(duì)話(huà)框設(shè)置
window.title('溫馨提示')
window.geometry(f"{window_width}x{window_height}+{x}+{y}")
window.resizable(False, False)
# 隨機(jī)選擇內(nèi)容和顏色
tip_text = random.choice(self.tips)
bg_color = random.choice(self.bg_colors)
# 創(chuàng)建內(nèi)容
label = tk.Label(
window,
text=tip_text,
bg=bg_color,
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')
# 窗口置頂
window.attributes('-topmost', True)
window.attributes('-alpha', 0.95)
# 關(guān)閉時(shí)間:2-4秒
close_time = random.randint(2000, 4000)
def close_window():
try:
if window.winfo_exists():
# 快速淡出
for alpha in range(95, 0, -10):
if window.winfo_exists():
window.attributes('-alpha', alpha/100)
window.update()
time.sleep(0.01)
window.destroy()
if window in self.active_windows:
self.active_windows.remove(window)
except:
pass
window.after(close_time, close_window)
# 點(diǎn)擊立即關(guān)閉
def on_click(event):
try:
if window.winfo_exists():
window.destroy()
if window in self.active_windows:
self.active_windows.remove(window)
except:
pass
window.bind('<Button-1>', on_click)
label.bind('<Button-1>', on_click)
# 顯示創(chuàng)建進(jìn)度
if self.windows_created % 10 == 0:
print(f"?? 已創(chuàng)建 {self.windows_created}/{self.window_count} 個(gè)對(duì)話(huà)框")
except Exception as e:
print(f"創(chuàng)建窗口時(shí)出錯(cuò): {e}")
def check_completion(self):
"""檢查是否所有窗口都已關(guān)閉"""
if len(self.active_windows) == 0 and self.windows_created >= self.window_count:
print("?? 所有溫馨提示已顯示完畢!")
self.root.quit()
else:
self.root.after(500, self.check_completion)
def start_random_creation(self):
"""開(kāi)始隨機(jī)創(chuàng)建窗口"""
def create_loop():
print("?? 開(kāi)始隨機(jī)彈出對(duì)話(huà)框...")
start_time = time.time()
# 持續(xù)創(chuàng)建直到達(dá)到目標(biāo)數(shù)量
while self.windows_created < self.window_count:
# 在主線(xiàn)程中創(chuàng)建窗口
self.root.after(0, self.create_random_window)
# 隨機(jī)間隔,創(chuàng)造更自然的彈出效果
time.sleep(random.uniform(0.03, 0.08))
end_time = time.time()
print(f"?? 所有 {self.window_count} 個(gè)對(duì)話(huà)框創(chuàng)建完成!耗時(shí): {end_time-start_time:.2f}秒")
print("??? 屏幕已被隨機(jī)彈出的對(duì)話(huà)框鋪滿(mǎn)!")
# 開(kāi)始檢查完成狀態(tài)
self.root.after(2000, self.check_completion)
return create_loop
def main(self):
"""主程序"""
# 顯示開(kāi)始信息
print("=" * 60)
print("?? 隨機(jī)彈出溫馨提示開(kāi)始!")
print(f"?? 目標(biāo): {self.window_count} 個(gè)對(duì)話(huà)框")
print("?? 每個(gè)對(duì)話(huà)框顯示2-4秒")
print("?? 點(diǎn)擊任意對(duì)話(huà)框立即關(guān)閉")
print("=" * 60)
# 在新線(xiàn)程中控制隨機(jī)創(chuàng)建
thread = threading.Thread(target=self.start_random_creation(), daemon=True)
thread.start()
try:
self.root.mainloop()
except KeyboardInterrupt:
print("\n?? 程序被用戶(hù)中斷")
finally:
print("?? 清理剩余對(duì)話(huà)框...")
for window in self.active_windows[:]:
try:
window.destroy()
except:
pass
self.root.quit()
def main():
"""主函數(shù)"""
manager = TipWindowManager()
manager.main()
if __name__ == "__main__":
main()總結(jié)
這個(gè)項(xiàng)目展示了如何使用 Python 的 Tkinter 庫(kù)創(chuàng)建有趣的 GUI 效果。通過(guò)結(jié)合多線(xiàn)程、隨機(jī)化和動(dòng)畫(huà)效果,我們實(shí)現(xiàn)了一個(gè)既美觀又實(shí)用的應(yīng)用程序。代碼結(jié)構(gòu)清晰,易于理解和修改,適合初學(xué)者學(xué)習(xí) GUI 編程。
不想運(yùn)行的也可以下載exe文件。
到此這篇關(guān)于Python Tkinter實(shí)現(xiàn)滿(mǎn)屏隨機(jī)彈出溫馨提示對(duì)話(huà)框的文章就介紹到這了,更多相關(guān)Python Tkinter滿(mǎn)屏隨機(jī)彈出溫馨提示對(duì)話(huà)框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python機(jī)器學(xué)習(xí)多層感知機(jī)原理解析
最簡(jiǎn)單的深度網(wǎng)絡(luò)稱(chēng)為多層感知機(jī),它們由多層神經(jīng)元組成,每一層都與下面一層(從中接收輸入)和上面一層(反過(guò)來(lái)影響當(dāng)前層的神經(jīng)元)完全相連2021-10-10
解決Tensorboard可視化錯(cuò)誤:不顯示數(shù)據(jù) No scalar data was found
今天小編就為大家分享一篇解決Tensorboard可視化錯(cuò)誤:不顯示數(shù)據(jù) No scalar data was found,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Python如何精準(zhǔn)定位并修改MP4文件的mvhd原子
深入了解MP4文件的結(jié)構(gòu)對(duì)于安全地修改元數(shù)據(jù)非常重要,這篇文章主要為大家詳細(xì)介紹了Python如何精準(zhǔn)定位并修改MP4文件的mvhd原子,需要的可以參考下2025-01-01
tf.nn.conv2d與tf.layers.conv2d的區(qū)別及說(shuō)明
這篇文章主要介紹了tf.nn.conv2d與tf.layers.conv2d的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
使用Python構(gòu)建一個(gè)高效的日志處理系統(tǒng)
這篇文章主要為大家詳細(xì)講解了如何使用Python開(kāi)發(fā)一個(gè)專(zhuān)業(yè)的日志分析工具,能夠自動(dòng)化處理、分析和可視化各類(lèi)日志文件,大幅提升運(yùn)維效率,需要的可以了解下2025-07-07
Python實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列的方法
這篇文章主要介紹了Python實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Python實(shí)現(xiàn)迪杰斯特拉算法并生成最短路徑的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)迪杰斯特拉算法并生成最短路徑的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
Python批量寫(xiě)入ES索引數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用python腳本批量寫(xiě)ES數(shù)據(jù)(需要使用pip提前下載安裝es依賴(lài)庫(kù)),感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02
Python設(shè)計(jì)模式之中介模式簡(jiǎn)單示例
這篇文章主要介紹了Python設(shè)計(jì)模式之中介模式,簡(jiǎn)單介紹了中介模式的概念、功能,并結(jié)合實(shí)例形式給出了Python定義與使用中介模式的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01

