我们看综艺的时候,经常能看到现场的提词板。今天我们就用tkinter做一个简单的提词板,用到了tkinter的label来动态显示文字。

我们就以最近火爆的《想见你》这首歌为例,按照歌词时间来显示歌词。首先我们要准备好歌词文件,一般是lrc的格式,每句歌词前面都有时间,随便去网上找一个,存成txt即可。

歌词文本是这样的:

我们只要分割每行的时间和歌词,然后根据时间更新下一句歌词就行了。由于格式是固定的,为了简便,按照固定位置截取即可,每一行都是从索引11开始为歌词,索引1-9是时间。

下面是主要的算法函数,用按钮来触发:

def showLrc():start = time.time()  #按下按钮开始计时,用于判断时间i=""for j in range(len(f)):lrc = f[j].decode().strip()  #lrc为当前这一行的内容      for k in range(11,len(lrc)):i+=lrc[k]  #每次刷新增加一个字#一共两行,用两个label来显示歌词if j%2==0:mes0.config(text=str(i),font=('黑体', 25),fg='Goldenrod')else:mes1.config(text=str(i),font=('黑体', 25),fg='Goldenrod')       time.sleep(0.1)  #每隔0.1秒刷新一次top.update_idletasks()  #更新界面      i=""#读取下一行的时间,即下一句歌词开始的时间点tiif j+1 < len(f):lrc = f[j+1].decode().strip()m = 10*int(lrc[1]) + int(lrc[2])  #分钟s = 10*int(lrc[4]) + int(lrc[5])  #秒ms = 100*int(lrc[7]) + 10*int(lrc[8]) + int(lrc[9])  #毫秒ti = m*60 + s + ms/1000second = time.time() - start#如果当前计时未到ti,则休眠两个时间的差值if second<ti:time.sleep(ti-second)#用空白来覆盖之前的文本,否则前后两次的文本会重合;#注意这里的顺序和之前相反,才能实现交替更新if j%2==0:mes1.config(text="                                                 ",font=('黑体', 25),fg='Goldenrod')else:mes0.config(text="                                                 ",font=('黑体', 25),fg='Goldenrod')top.update_idletasks()

下面是完整的代码:

import re
import time
from tkinter import *top = tkinter.Tk()
top.title('提词板')
top.geometry(800x100)
f = open('C:/Users/lin042/Desktop/歌词.txt','rb').readlines()
for i in range(2):exec("mes{} = tkinter.Label(text='')".format(i))exec('mes{}.pack()'.format(i))def showImg():start = time.time()i=""for j in range(len(f)):lrc = f[j].decode().strip()       for k in range(11,len(lrc)):i+=lrc[k]if j%2==0:mes0.config(text=str(i),font=('黑体', 25),fg='Goldenrod')else:mes1.config(text=str(i),font=('黑体', 25),fg='Goldenrod')       time.sleep(0.1)top.update_idletasks()i=""if j+1 < len(f):lrc = f[j+1].decode().strip()m = 10*int(lrc[1]) + int(lrc[2])s = 10*int(lrc[4]) + int(lrc[5])ms = 100*int(lrc[7]) + 10*int(lrc[8]) + int(lrc[9])ti = m*60 + s + ms/1000second = time.time() - startif second<ti:time.sleep(ti-second)if j%2==0:mes1.config(text="                                                 ",font=('黑体', 25),fg='Goldenrod')else:mes0.config(text="                                                 ",font=('黑体', 25),fg='Goldenrod')top.update_idletasks()submit_button = tkinter.Button(top, text ="想见你", font=('黑体', 10),fg='red',width=10,height=2,command = showImg)
submit_button.place(x=10, y=10)
top.mainloop()

注意这个语句:

for i in range(2):
exec("mes{} = tkinter.Label(text='')".format(i))
exec("mes{}.pack()".format(i))

exec用于创建动态的变量名,这里虽然只有两个label的变量,但如果想多行显示的话,就不能一个一个地声明,用这个方法想创建多少个都可以。

下面是成果:

想见你想见你想见你https://www.zhihu.com/video/1238151480139108352

打开手机里的音乐,试试能不能对得上歌词吧。

不过这程序运行起来以后,由于程序一直在循环里面跑,不能再动电脑,也不能同时运行其他软件,否则所有动态效果都会卡住,直到歌词全部更新完。

也许这个提词板挺没用的,但用tkinter动态更新文字的方法,记下来也不亏。比如我们还可以用它来做一个抽奖的滚动画面,或者点名(只能实现动态效果,想要外界终止,需要用到after方法和StringVar,这个我们下次再探讨吧!)

tkinter label_tkinter做一个简易提词板相关推荐

  1. 怎么用线程刷新 tkinter 进度条_tkinter做一个简易提词板(2)

    书接上文 花果山美男子:tkinter做一个简易提词板​zhuanlan.zhihu.com 上回说到,文字的动态效果还可以用after方法和StringVar来实现,今天我们就用它们来重新制作提词板 ...

  2. 使用Python中内置tkinter模块做一个简易的计算器

    当前环境: windows + python3.7 + tkinter 模块 一.总体规划 1.需要用到的模块有  tkinter 2.tkinter 模块中需要用到的知识点有: 2.1.创建主窗口 ...

  3. 使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能

    使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能 1使用webpack下载vue模板 vue init webpack aaa(aaa为项目名称) cd到aaa ...

  4. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)

    Python做一个简易登录注册GUI界面 一,效果展示 (1)运行结果: (2)点击登录: 注:只有用户名:123 密码123456 会提示登录成功. 登录成功示范: 登录失败示范: (3)点击注册 ...

  5. 用layui做一个简易的登录注册页面

    用layui做一个简易的登录注册页面 1.首先在主页绑定一个点击事件,点击登录按钮就可以弹出一个弹出窗,一般商场登录页面不会跳转一个新页面,因为如果进入一个新页面,登录后需要跳转会原来的页面,这样会导 ...

  6. 如何用idea做一个简易的网页登录界面

    在上一节课的内容基础上做一个简易的网页登录界面--18级软工1班03 打开idea后打开上一节课的工程文件(一般在打开idea软件的同时,idea会默认打开上一次的文件)并在左边列表的main文件夹下 ...

  7. arduino智能浇花系统_解放双手!自己动手做一个简易智能浇花系统

    原标题:解放双手!自己动手做一个简易智能浇花系统 面对疫情,宅在家的我们可以以各种方式为战"疫"一线的医护工作者.紧急研究病毒的科研人员.口罩厂日夜工作的人们......加油打气. ...

  8. 用JS做一个简易的时间显示动态效果

    用JS做一个简易的时间显示动态效果 运行效果 代码 <!DOCTYPE html> <html lang="en"><head><meta ...

  9. 第三章:做一个简易登陆界面

    一.内容 做一个简易的登陆界面,包含: 1.有账号输入和密码输入 2.有登陆和取消按钮 3.密码要带有屏蔽功能 4.通过取消按钮讲一点槽函数的运用 二.创建工程(初次做这个小例程,附带上建工程的步骤) ...

最新文章

  1. Nautilus启动报错
  2. MapReduce基础开发context.write注意new text()多出一列的问题
  3. xcode 可以打开xmind_原来xmind还有一款如此漂亮的思维导图工具
  4. Python3 拼接符+和join效率对比测试
  5. [pytorch、学习] - 9.2 微调
  6. 一步步编写操作系统 66 浅析c库函数与系统调用1
  7. 第二十七篇、使用MVVM布局页面
  8. python color属性_Python中类的属性、方法及内置方法
  9. framset和fram的嵌套
  10. OPPO Find X,一款(可能)被全面屏“耽搁”了的AI手机
  11. mysql5.7 存储二进制_MySQL5.7 基于二进制包的安装
  12. 小波变换和motion信号处理(一)
  13. 学习时间序列法ARIMA模型与LSTM很好的文章
  14. winpe装双系统linux_如何安装linux,winpe下如何安装linux的ISO
  15. 云服务器重装系统步骤,腾讯云服务器如何更换操作系统?更换系统镜像重装系统方法...
  16. 两篇超好的C#操作并口和串口的文章
  17. 纯前端实现人体抠图背景融合-调用Face++抠像接口API实现人像抠图
  18. 标签系列二:spring 中bean解释以及bean标签里面的属性
  19. 【论文笔记之 FDAF and MAF】Frequency-Domain and Multirate Adaptive filtering
  20. 几种矩阵分解算法: LU分解,Cholesky分解,QR分解,SVD分解,Jordan分解

热门文章

  1. bootstrap清除拟态框内添加新HTML再打开时会有缓存现象
  2. transformer bert GPT(未完)
  3. [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]
  4. mac如何看html5视频播放器,苹果Mac系统看HTML5视频教程介绍
  5. sqlserver 微信昵称_sql server用户名和登录名的区别和联系
  6. B. The Cake Is a Lie
  7. php 判斷數據庫表是否存在,phpl判斷mysq數據庫中的某個數據表是否存在的方法總結...
  8. java符号引用 直接引用_Java -- JVM的符号引用和直接引用
  9. 服务器iis自动停止,IIS应用程序池老是自动停止
  10. python 导入包 作用域_Python 包、模块、函数、变量作用域