tkinter label_tkinter做一个简易提词板

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

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

歌词文本是这样的:

v2-7f2d7c37a57fcdc19b23820102508fd0_b.jpg

我们只要分割每行的时间和歌词,然后根据时间更新下一句歌词就行了。由于格式是固定的,为了简便,按照固定位置截取即可,每一行都是从索引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的变量,但如果想多行显示的话,就不能一个一个地声明,用这个方法想创建多少个都可以。

下面是成果:

v2-e7cd772f795f457d1daf341f8ba8711a.jpeg
想见你想见你想见你https://www.zhihu.com/video/1238151480139108352

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】C#命名空间与java包的区别分析

本文实例分析了C#命名空间与java包的区别。分享给大家供大家参考。具体分析如下&#xff1a; 相同点&#xff1a; 1、都是为了重用性&#xff08;reusebility&#xff09;——软件工程中一个非常重要的目标。 2、C#里面的命名空间和java中的包都属于访问权限的控制机制。 不…

web前后端 http转https

1.转换前准备 http转https需要一个证书、本文已ssl证书举例&#xff0c;只有认证的证书才能被认可。阿里云可以申请免费的证书&#xff0c; 但是生成证书需要域名。且域名要绑定ip。故ssl申请前需要域名。可上阿里云购买。 证书申请教程:证书申请 绑定ip:如果没有服务器、也…

python编码解码单词_在使用w2v时python中的编码问题

我正在使用word2vec模型在python中编写我的第一个应用程序。 这里是我的简单的代码在使用w2v时python中的编码问题 import gensim, logging import sys import warnings from gensim.models import Word2Vec logging.basicConfig(format%(asctime)s : %(levelname)s : %(messag…

Qt开发技巧:编写.pro文件,在构建流程中加入命令行的方法

1、在项目构建前执行命令 在项目构建前执行命令cmd存在问题system(cmd)存在执行多次的问题&#xff0c;可以参考message函数的QMake Manual说明 优化后的表达式如下&#xff0c;这样此命令只会在构建前执行一次&#xff1a; !build_pass:system(cmd) 2、在链接前后执行&#x…

【转】C# 命名空间 Namespace (学习心得 23)

命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。 超级小白友好&#xff0c;讲解C#基础&#xff0c;每集5分钟轻松学习&#xff0c;拒绝从入门到放弃&#xff01; 文章目录 一、定义命名空间二、using 关键字三、嵌套命名空间一、定义命名空间 关键字 namesp…

spring boot 对象拷贝工具(Orika)

1.spring 自带拷贝工具 LoginUser user new LoginUser(); // 将data中字段相同的属性拷贝到user中BeanUtils.copyProperties(data , user); 2. 基于Orika的字节码拷贝工具 1) pom <!-- 基于字节码的深拷贝工具类 --><dependency><groupId>ma.glasn…

c++清空输入缓冲区_干货 | C++的输入输出方法

C和C并没有将输入与输出实现在语言中&#xff0c;而是在类库中实现。作为C的超集&#xff0c;C继承了C的输入输出方法。同时将输入与输出视为字流。流充当了程序和流源流目标之间的桥梁。本文将介绍C的输入输出方式&#xff0c;并且浅谈C与C均有的输入输出方式对C有一定学习的同…

【转】c# 命名空间和程序集

命名空间&#xff1a;用于对相关的类型进行逻辑分组&#xff0c;使用命名空间有利于方便定位一个类型 使用类的全权名&#xff1a; System.Text.StringBuilder sb new System.Text.StringBuilder(); 上面的写法很繁琐&#xff0c;使用using语句引入命名空间&#xff1a; usin…

Qt应用程序发布:Qt应用程序添加版本版权生产商等信息

设置方法 在QMake Manual手册中搜索关于QMAKE_TARGET内容可以看到有如下QMake变量&#xff1a; QMAKE_TARGET_COMPANY&#xff1a;用于指定生产商QMAKE_TARGET_DESCRIPTION&#xff1a;用于描述应用程序QMAKE_TARGET_COPYRIGHT&#xff1a;用于声明版权QMAKE_TARGET_PRODUCT&…

SM4前后端数据传输整体加密

1.SM所需包 pom <!--sm加密--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version></dependency><dependency><groupId>com.alibaba</gr…

QWidget::size()和QResizeEvent::size()不一定相同!

问题发现 QGraphicsView中将画布设置为和视图相同大小需要使用e->size()&#xff0c;用this->size()会出现滚动条&#xff01; Qt手册中说&#xff0c; QWidget::size()是窗口大小&#xff08;不包括边框&#xff09;&#xff0c;e->size()是可视区域大小&#xff0…

stl源码剖析_STL源码剖析 阅读笔记(二)allocator

一、空间分配器 allocator从使用上看&#xff0c;空间分配在任何语言的任何组件都不需要我们去过多关心&#xff0c;因为语言、组件的底层肯定都比较完整的做了这件事情。从实现上看&#xff0c;学习 allocator 的原理在源码学习中是首当其冲。因为没有空间分配&#xff0c;则无…

【转】C#中的命名空间namespace全解

.NET Framework 类库提供下列命名空间&#xff1a; 【Microsoft】 Microsoft.CSharp 包含支持用 C# 语言进行编译和代码生成的类。 Microsoft.JScript 包含支持用 JScript 语言进行编译和代码生成的类。 Microsoft.VisualBasic 包含支持用 Visual Basic .NET 语言进行编译和…

easyexcel将对象处理为多列,自增序列

概述 主要记录在开发中遇到的问题&#xff1a;使用easyexcel导出excel&#xff0c;一般数据都是保存在数据库中&#xff0c;如果查询返回的是一个实体类&#xff0c;且里面有嵌套的实体类对象&#xff0c;这时导出的时候要先对查询出的数据进行业务逻辑处理&#xff0c;让它符…

Qt-VS开发:解决VS中使用带有信号槽的导出对象库时,信号槽不工作的问题

解决办法 需要把导出库的头文件加入到调用此动态库的项目中&#xff0c;只加入到搜索目录中是不行的。 加入到项目中后&#xff0c;VS会自动生成moc_xxx.cpp文件&#xff0c;可以在GeneratedFiles/Debug或GeneratedFile/Release中找到&#xff0c;必须有文件才能实现信号槽。

C# 编程规范

一、命名 1.用pascal规则来命名方法和类型. publicclass TextBox { publicvoid DataBind() { } } 2.用camel规则来命名局部变量和方法的参数&#xff0c; string strUserName;public AddUser(string userId, byte[] passWord); (并加前缀 数据类型&#xff0c;可选。)s…

python做excel表格代码_python操作excel表格

我们在写测试用例的时候&#xff0c;是创建一个表格.xlsx&#xff0c;然后把各种条件加到这张表格中去&#xff0c;所以&#xff0c;如何对excel表格操作&#xff0c;是相当重要的一环&#xff0c;那么&#xff0c;接下来&#xff0c;这篇博客就直接教会大家如何通过python去处…

Windows 查看程序ip地址(面对小白)

前言&#xff1a;Windows自带资源管理器可以查看程序的IP地址。下面以微信通话为例&#xff0c;详细步骤如下(面向小白)&#xff1a; 打开任务管理器 打开方法(以下方法都可以)&#xff1a; 键盘按住 【ctrl】 【alt】 【delete】 ,选择【任务管理器】Windows 10 以下系统…

解决Qt graphis-view框架中,上层图元接收hover事件导致底层图元接收不到的问题

问题重现 两个图元&#xff0c;一个在上面&#xff0c;名为item_up&#xff0c;一个在下面&#xff0c;名为item_below。 当item_up->setAcceptHoverEvents(true)时&#xff0c;item_up可以接收到鼠标悬停事件&#xff08;hoverEnter&#xff0c;hoverMove&#xff0c;hove…

【转】C#中相同不同程序集存在相同的命名空间的时候的冲突解决办法

快速解决办法描述描述: 1.将相同命名空间的不同程序集分别进行取别名&#xff1a;【具体操作:右击相同程序的引用&#xff0c;在别名上修改&#xff0c;默认的为global】。 2.调用&#xff1a;在所在调用文件里面最前面写 extern alias 别名&#xff0c;然后using 别名.Names…