在我的 tkinter 音樂播放器專案中,我正在與一個跑馬燈標簽合作。
為此,我使用了一個名為 marquee 的函式。
所以當我運行我的腳本時,跑馬燈速度是正常的。在我前進到下一首歌曲后,它會加速等等。
我不知道如何阻止它超速。我正在播放大約 30fps 的影片
有人可以建議任何方法嗎?
def marquee(song_name,fs) :
global canvas,fps
fps = fs
canvas=Canvas(Frame1)
canvas.grid(row=1)
text_var= song_name
text=canvas.create_text(0,-2000,text=text_var,font=('calibri',20,'bold'),fill='black',tags=("marquee",),anchor='w')
x1,y1,x2,y2 = canvas.bbox("marquee")
width = x2-x1
height = y2-y1
canvas['width']='440'
canvas['height']=height
shift()
def shift():
global canvas,fps
x1,y1,x2,y2 = canvas.bbox("marquee")
if(x2<0 or y1<0):
x1 = canvas.winfo_width()
y1 = canvas.winfo_height()//2
canvas.coords("marquee",x1,y1)
else:
canvas.move("marquee", -2, 0)
canvas.after(1000//fps,shift)
完整代碼:https : //codeshare.io/zy6vyk
uj5u.com熱心網友回復:
問題是每次呼叫時marquee都會開始一個新回圈。因此,第一個回圈將選取框每幀移動 -2 個像素。下次呼叫marquee它時會啟動另一個回圈,同時將文本每幀移動 -2 像素。所以現在文本每幀移動 -4 像素。等等。
有幾種方法可以解決這個問題。一種是跟蹤呼叫的 id after,并在開始新回圈之前取消它。這將終止舊回圈并開始一個新回圈。
第二種解決方案是僅呼叫marquee一次以啟動在程式生命周期內運行的單個回圈。每當歌曲更改時,您只需使用新歌曲標題更新現有的選取框,而不是使用新的回圈創建新的選取框。
第二種解決方案是我推薦的。由于您要向選取框文本添加唯一標簽,因此您可以使用該標簽來更改文本。您只需要一個用于更改文本的新功能。
例如:
def new_song(song_title):
canvas.itemconfigure("marquee", text=song_title)
有了這個,你只需要呼叫new_song而不是marquee每次歌曲改變時。
new_song("This is a new song")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/371745.html
