专栏导读

-
🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
-
-
-
-
📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅
-
文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
-
❤️ 欢迎各位佬关注! ❤️
🧠 前言
在视频网站上,“弹幕”是一种非常流行的互动方式,文字从右向左飞过屏幕,实时表达观众情绪。你是否想过,其实只需要用 Python 和自带的 GUI 库 Tkinter,也能实现一个类似效果的小工具?
今天我们就来用 Python 手写一个“疯狂弹幕”的效果,窗口一打开,弹幕飞满屏,完全停不下来!适合:
-
做一些有趣的界面展示;
-
活跃现场气氛;
-
学习 Tkinter 动态动画的基本原理。
🧰 技术栈
-
Python 3.x
-
Tkinter 图形界面库(标准库自带)
-
字体、颜色、动画基础
🚀 效果展示
-
运行程序后,将看到五彩缤纷的文字从右往左飞过窗口,弹幕内容随机生成,颜色和字体大小各不相同,非常具有视觉冲击力。

🧩 核心思路
-
1. Tkinter 创建窗口:设置固定大小窗口背景为黑色;
-
2. 定时生成弹幕:随机选择内容、颜色、字体,在窗口顶部随机位置创建文字标签;
-
3. 移动弹幕标签:每 30ms 移动一次标签位置,模拟“飞行”效果;
-
4. 弹幕移出屏幕后自动销毁,节省资源;
-
5. 无限循环生成新弹幕,让屏幕永远“炸”起来!
🧩库的安装
库 | 用途 | 安装 |
---|
tkinter | 界面设计 | pip install tkinter -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
4、完整代码
import tkinter as tk
import random
from tkinter import font as tkFont
class DanmuApp:
def __init__(self, root):
self.root = root
self.root.title("弹幕演示")
self.root.geometry("800x600")
self.root.configure(bg='black')
self.danmu_list = [
"这是一条弹幕", "Hello World!", "Python真强大",
"Tkinter实现弹幕", "好好学习天天向上", "666666",
"弹幕效果不错", "颜色随机变化", "速度也可以调整",
"支持多行弹幕", "字体大小随机", "从右向左滚动"
]
self.colors = ['red', 'yellow', 'green', 'cyan', 'white', 'pink', 'orange']
self.fonts = [
tkFont.Font(family="Arial", size=20),
tkFont.Font(family="Courier New", size=22),
tkFont.Font(family="Helvetica", size=18),
]
self.active_danmus = []
self.root.after(100, self.start_danmu)
self.root.after(30, self.move_danmus)
self.root.bind('<Escape>', lambda e: self.root.destroy())
def start_danmu(self):
self.window_width = self.root.winfo_width()
self.window_height = self.root.winfo_height()
self.generate_danmu()
def generate_danmu(self):
text = random.choice(self.danmu_list)
color = random.choice(self.colors)
font = random.choice(self.fonts)
y_pos = random.randint(20, self.window_height - 40)
label = tk.Label(
self.root,
text=text,
fg=color,
bg='black',
font=font
)
label.place(x=self.window_width, y=y_pos)
danmu_info = {
'label': label,
'speed': random.randint(5, 15),
'y_pos': y_pos
}
self.active_danmus.append(danmu_info)
self.root.after(random.randint(300, 1000), self.generate_danmu)
def move_danmus(self):
for danmu in self.active_danmus[:]:
label = danmu['label']
current_x = label.winfo_x()
new_x = current_x - danmu['speed']
if new_x < -label.winfo_width():
label.destroy()
self.active_danmus.remove(danmu)
else:
label.place(x=new_x, y=danmu['y_pos'])
self.root.after(30, self.move_danmus)
if __name__ == "__main__":
root = tk.Tk()
app = DanmuApp(root)
root.mainloop()
总结
-
希望对初学者有帮助
-
致力于办公自动化的小小程序员一枚
-
希望能得到大家的【一个免费关注】!感谢
-
求个 🤞 关注 🤞
-
-
求个 ❤️ 喜欢 ❤️
-
-
求个 👍 收藏 👍
-