我用tkinter库写了一个音频播放器,用Scale弄了一个进度条滑块,我把音乐播放的路径存到了musiclist列表里面了,怎么能让滑块随着音乐的播放而往前走呢?
2条回答 默认 最新
apples_kk 2023-05-24 14:04关注你可以使用set()函数来设置Scale组件的值。在音乐播放时,你可以在每一秒钟取当前的音乐播放时间,再将其除以总时长,然后将计算出的比例值传递给set()函数即可实现滑块随着音乐进度的移动。
import tkinter as tk import pygame class MusicPlayer: def __init__(self, master, music_list): self.music_list = music_list self.current_music_index = -1 self.is_playing = False master.title("音乐播放器") master.geometry("400x200") self.scale = tk.Scale(master, from_=0, to=100, orient=tk.HORIZONTAL, length=300) self.scale.pack() self.play_pause_button = tk.Button(master, text="播放", command=self.play_pause_music) self.play_pause_button.pack() self.load_music() def load_music(self): if self.current_music_index < len(self.music_list) - 1: self.current_music_index += 1 else: self.current_music_index = 0 pygame.mixer.music.load(self.music_list[self.current_music_index]) def play_pause_music(self): if not self.is_playing: pygame.mixer.music.play() self.is_playing = True self.play_pause_button.config(text="暂停") self.update_scale() else: pygame.mixer.music.pause() self.is_playing = False self.play_pause_button.config(text="播放") def update_scale(self): if self.is_playing: current_time = pygame.mixer.music.get_pos() / 1000 total_time = pygame.mixer.Sound(self.music_list[self.current_music_index]).get_length() progress = (current_time / total_time) * 100 self.scale.set(progress) self.scale.after(1000, self.update_scale) else: self.scale.set(0) def main(): pygame.mixer.init() music_list = ["music1.mp3", "music2.mp3", "music3.mp3"] root = tk.Tk() MusicPlayer(root, music_list) root.mainloop() pygame.mixer.quit() if __name__ == "__main__": main()在这段代码中,update_scale()是用来更新Scale组件滑块位置的函数。它首先获取当前音乐播放的时间和总时间,然后计算出比例值。最后使用set()函数来设置Scale组件的值。我们使用after()函数来调度下一次更新,这样可以保证滑块的更新系数与音乐播放的更新系数一致,从而实现滑块随着音乐进度的移动。最后需要注意的是,在关闭程序前需要调用pygame.mixer.quit()来释放音频资源。
本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报解决 2无用