pygame.mixer PyQt5 threading子线程控制stop_event QPushButton 选择文件 后播放 停止按钮 具体代码
时间: 2024-02-19 08:59:27 浏览: 181
以下是一个示例代码,演示了如何在PyQt5中使用Pygame.mixer和threading模块,控制一个QPushButton按钮来选择并播放音乐文件,以及停止播放,并且使用stop_event来控制线程的停止。
```python
import os
import sys
import threading
import pygame
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFileDialog
class MusicPlayer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建选择文件按钮和播放、停止按钮
self.selectFileBtn = QPushButton('选择文件', self)
self.selectFileBtn.move(20, 20)
self.selectFileBtn.clicked.connect(self.select_file)
self.playBtn = QPushButton('播放', self)
self.playBtn.move(20, 60)
self.playBtn.clicked.connect(self.play_music)
self.stopBtn = QPushButton('停止', self)
self.stopBtn.move(20, 100)
self.stopBtn.clicked.connect(self.stop_music)
# 初始化Pygame.mixer并创建一个线程
pygame.mixer.init()
self.stop_event = threading.Event()
self.music_thread = threading.Thread(target=self.play_music_thread, args=(self.stop_event,))
# 设置窗口属性
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('音乐播放器')
self.show()
def select_file(self):
# 弹出文件选择对话框
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
fileName, _ = QFileDialog.getOpenFileName(self, '选择音乐文件', '', '音乐文件 (*.mp3 *.wav)', options=options)
if fileName:
# 保存选择的文件路径
self.filePath = fileName
def play_music(self):
# 播放音乐
if hasattr(self, 'filePath'):
# 如果已经选择了文件,则启动音乐播放线程
self.music_thread.start()
else:
print('请先选择音乐文件!')
def play_music_thread(self, stop_event):
# 在新线程中播放音乐
pygame.mixer.music.load(self.filePath)
pygame.mixer.music.play()
while not stop_event.is_set():
pygame.time.Clock().tick(10)
pygame.mixer.music.stop()
def stop_music(self):
# 停止音乐
self.stop_event.set()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MusicPlayer()
sys.exit(app.exec_())
```
在此示例代码中,我们添加了一个stop_event变量来控制线程的停止。在`play_music_thread`方法中,我们使用了一个while循环,来检查stop_event是否已经被设置,如果被设置了,则停止音乐播放并退出循环。在`stop_music`方法中,我们设置了stop_event,来通知线程停止播放音乐。
此外,我们还重载了QWidget类的`event`方法,来处理窗口关闭事件。在窗口关闭时,我们设置了stop_event,以确保音乐播放线程被正确地停止。
阅读全文