本应用是在python3环境下,使用tkinter实现客户端图形界面,使用flask web框架构建web的弹幕吐槽应用。
目前本应用在本人的服务器上有一个实例:jdmy的个人网站
-
username:admin
-
password:admin
欢迎围观并留下吐槽
服务场景:++小型分享会++(PS:场景特点是人员都集中在一个房间内,且具有一个轻松愉快的氛围)
服务对象:++主讲人、观众++
主要功能:
- 为观众呈现可吐槽的页面
- 为主讲人以弹幕形式呈现观众吐槽的内容
- 为分享会带来互动性和一定的娱乐效果
服务方式:++主讲人在一个服务器上部署应用服务器端,并在投影的电脑上用python打开应用客户端,再把对应的URL、登陆账号和密码公布给观众,观众用手机浏览器打开url并登陆之后即可输入吐槽内容,吐槽内容会以弹幕的形式在主讲人的电脑上呈现。++
sequenceDiagram
手机端->>服务器端: 登陆
服务器端->>手机端: 登陆后的界面
手机端->>服务器端: 发送弹幕内容
服务器端->>客户端: 传递弹幕内容
客户端->>客户端桌面:呈现弹幕
服务器端:
app类(web路由) |
---|
danmu_input()让观众输入吐槽内容的页面 |
danmu_get()让客户端获取吐槽内容,对观众是隐藏的 |
login()观众登陆页面 |
logout()让观众注销登陆 |
forms类 |
---|
DanmuForm(FlaskForm)继承于FlaskForm,用于生成页面表单 |
客户端:
danmu类 |
---|
self.text 内容 |
self.id 主键,删除弹幕时用得到 |
self.x 弹幕x轴 |
self.y 弹幕y轴 |
init(self, text, id, x, y)弹幕内容、坐标初始化 |
move(self)控制弹幕的移动方式 |
danmu_GUI类 |
---|
self.ws 获取屏幕宽度 |
self.hs 获取屏幕高度 |
self.canvas 构建画布 |
self.colors 设定颜色集 |
self.q 与socket_connect类进行进程间通信的队列,用于获取弹幕 |
MainWindow(tkinter.Tk)主界面,非透明,可用来关闭客户端 |
FloatingWindow(tkinter.Toplevel)透明界面,用来呈现非透明的弹幕 |
danmu_handler(self)处理弹幕,使弹幕以设定好的的方式移动,并删除掉已经到达终点的弹幕 |
danmu_add(self)根据self.q内的弹幕内容创建画布上的弹幕,弹幕的大小、颜色、初始y轴位置随机 |
init(self, q) 初始化 |
socket_connect类 |
---|
self.url 用于设定服务器端的url |
invoke_sock(q)用于向服务器进行轮询,若返回的内容有效,则将其通过通信队列q传输到danmu_GUI类 |
本应用的服务器端到客户端的通信,最初是通过socket通信实现的,主要思路就是服务器端进程开一个线程,线程另开一个端口执行socket通信,但是这样与flask web框架极不兼容,只能够在调试环境下成功运行。
于是我果断放弃了用socket进行实时推送弹幕数据的方法,改为最为简单可靠的轮询机制。这样子只会带来弹幕显示的一点延迟,但是极为可靠。
本应用的扩展性极高,经扩展,可以存储弹幕到数据库、自定义弹幕颜色、大小、移动速度