python如何在界面中添加音乐播放实时进度条,并且可以实现点击进度条更改对应播放位置
时间: 2024-02-12 07:04:47 浏览: 175
python实现闹钟定时播放音乐功能
要在Python界面中添加音乐播放实时进度条并且可以实现点击进度条更改对应播放位置,可以借助Python的GUI库Tkinter和Pygame库来完成。
首先,需要使用Tkinter创建一个窗口,并在窗口中添加一个Canvas控件用于显示进度条。可以使用以下代码创建窗口和Canvas控件:
```python
import tkinter as tk
# 创建窗口
root = tk.Tk()
root.title('Music Player')
root.geometry('500x300')
# 创建Canvas控件用于显示进度条
canvas_width = 400
canvas_height = 20
canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()
```
然后,需要使用Pygame库中的`pygame.mixer.music.get_pos()`方法获取当前音乐播放的时间,并将进度条绘制到Canvas控件上。可以使用以下代码实现:
```python
import pygame
import threading
# 加载并播放音乐文件
pygame.mixer.init()
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play()
def update_progress():
while pygame.mixer.music.get_busy():
# 获取当前播放时间
current_time = pygame.mixer.music.get_pos() / 1000
# 获取总时长
total_time = pygame.mixer.music.get_length() / 1000
# 计算当前播放进度
progress = current_time / total_time
# 绘制进度条
canvas.delete('progress')
canvas.create_rectangle(0, 0, progress * canvas_width, canvas_height, fill='blue', tags='progress')
# 等待0.1秒
pygame.time.wait(100)
# 创建线程更新进度条
t = threading.Thread(target=update_progress)
t.start()
```
最后,要实现点击进度条更改对应播放位置的功能,可以在Canvas控件上绑定鼠标点击事件,并使用`pygame.mixer.music.set_pos()`方法来设置当前播放时间。可以使用以下代码实现:
```python
def set_progress(event):
# 获取点击位置的横坐标
x = event.x
# 计算对应的播放时间
current_time = (x / canvas_width) * (pygame.mixer.music.get_length() / 1000)
# 设置当前播放时间
pygame.mixer.music.set_pos(current_time * 1000)
# 绑定鼠标点击事件
canvas.bind('<Button-1>', set_progress)
```
完整代码示例:
```python
import tkinter as tk
import pygame
import threading
# 创建窗口
root = tk.Tk()
root.title('Music Player')
root.geometry('500x300')
# 创建Canvas控件用于显示进度条
canvas_width = 400
canvas_height = 20
canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()
# 加载并播放音乐文件
pygame.mixer.init()
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play()
def update_progress():
while pygame.mixer.music.get_busy():
# 获取当前播放时间
current_time = pygame.mixer.music.get_pos() / 1000
# 获取总时长
total_time = pygame.mixer.music.get_length() / 1000
# 计算当前播放进度
progress = current_time / total_time
# 绘制进度条
canvas.delete('progress')
canvas.create_rectangle(0, 0, progress * canvas_width, canvas_height, fill='blue', tags='progress')
# 等待0.1秒
pygame.time.wait(100)
# 创建线程更新进度条
t = threading.Thread(target=update_progress)
t.start()
def set_progress(event):
# 获取点击位置的横坐标
x = event.x
# 计算对应的播放时间
current_time = (x / canvas_width) * (pygame.mixer.music.get_length() / 1000)
# 设置当前播放时间
pygame.mixer.music.set_pos(current_time * 1000)
# 绑定鼠标点击事件
canvas.bind('<Button-1>', set_progress)
root.mainloop()
```
运行代码后,可以在界面中看到一个进度条。点击进度条可以更改对应的播放位置。
阅读全文