怎么用线程刷新 tkinter 进度条_tkinter做一个简易提词板(2)
書接上文
花果山美男子:tkinter做一個(gè)簡(jiǎn)易提詞板?zhuanlan.zhihu.com上回說(shuō)到,文字的動(dòng)態(tài)效果還可以用after方法和StringVar來(lái)實(shí)現(xiàn),今天我們就用它們來(lái)重新制作提詞板吧。
思路差不多,直接上代碼:
import re from tkinter import *top = tkinter.Tk() top.title('提詞板') top.geometry(top,800x80) f = open('C:/Users/lin042/Desktop/歌詞.txt','rb').readlines() var1 = StringVar(value='') var2 = StringVar(value='') mes0 = tkinter.Label(top,textvariable=var1,font=('黑體', 20),fg='Goldenrod') mes0.pack() mes1 = tkinter.Label(top,textvariable=var2,font=('黑體', 20),fg='Goldenrod') mes1.pack()j=0 #歌詞行數(shù) k=11 #每個(gè)字在當(dāng)句的位置下標(biāo) i="" #下一次刷新的內(nèi)容 flag=True #是否暫停 is_run = False #是否正在運(yùn)行 ti,t0=0,1 tt=0def show(var1, var2):global j,k,i,flag,ti,t0,ttlrc = f[j].decode().strip()i+=lrc[k]#兩行提詞板交替更新if j%2==0:var1.set(i)else:var2.set(i)k+=1if k==len(lrc):j+=1 i=""k=11if j==len(f):returnif j< len(f): #這里是j而不是j+1,因?yàn)樘嵩~板需要提前一句 t0=ti #記錄上一次的起始時(shí)間點(diǎn)lrc2 = f[j].decode().strip()m = 10*int(lrc2[1]) + int(lrc2[2])s = 10*int(lrc2[4]) + int(lrc2[5])ms = 100*int(lrc2[7]) + 10*int(lrc2[8]) + int(lrc2[9])ti = m*60 + s + ms/1000 #本句歌詞的起始時(shí)間點(diǎn)#如果不是同一句,則計(jì)算兩句的間隔時(shí)間(毫秒)if t0!=ti:tt=int(1000*(ti-t0)) #根據(jù)下一句歌詞字?jǐn)?shù)計(jì)算每個(gè)字的刷新間隔 w=int(tt/(len(lrc)-11))if flag:top.after(w, showImg, var1, var2) else:flag=Truereturn #開始 def lottery_start(var1, var2):global is_runif is_run: #判斷是否正在運(yùn)行returnis_run = Trueshow(var1, var2) #暫停 def lottery_end():global flag, is_runif is_run:flag = Falseis_run = Falsesubmit_button = tkinter.Button(top, text ="想見你", font=('黑體', 10),fg='red',width=10,height=2,command = lambda: lottery_start(var1, var2)) submit_button.place(x=10, y=5) submit_button = tkinter.Button(top, text ="不見了", font=('黑體', 10),fg='red',width=10,height=2,command = lambda: lottery_end()) submit_button.place(x=10, y=40)top.mainloop()既然是提詞板,唯一需要注意的就是如何讓歌詞按照時(shí)間來(lái)更新。由于是用after來(lái)設(shè)置刷新時(shí)間的,因此這次我們根據(jù)每?jī)删涓柙~之間的時(shí)間間隔,來(lái)設(shè)置after()里面的第一個(gè)參數(shù),也就是時(shí)間。
刷新間隔w=兩句歌詞的間隔/下一句歌詞的字?jǐn)?shù)
這個(gè)after函數(shù)需要遞歸調(diào)用,以實(shí)現(xiàn)界面的刷新。
注意事項(xiàng):
command = lambda: lottery_start(var1, var2)command = lambda: lottery_end()
這兩句必須加上lambda,否則按鈕就會(huì)失效,變成啟動(dòng)程序自動(dòng)播放了。而且和之前不同的是,即使關(guān)聯(lián)的函數(shù)沒有參數(shù),也要加上括號(hào)。
用同樣的方法,我們還可以做很多程序,比如點(diǎn)名提問、滾動(dòng)抽獎(jiǎng)、誰(shuí)去取外賣等等,我就做了一個(gè)“今天誰(shuí)刷碗”的程序,反正怎么抽都是我刷就對(duì)了。
成果就不放了,今天懶得錄屏。
總結(jié)
以上是生活随笔為你收集整理的怎么用线程刷新 tkinter 进度条_tkinter做一个简易提词板(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机专业大学排名_计算机专业大学排名公
- 下一篇: python中模块和函数_Python中