Python 程序不';在PyQt中退出后不会关闭

Python 程序不';在PyQt中退出后不会关闭,python,pyqt,pygame,pyqt5,Python,Pyqt,Pygame,Pyqt5,所以,最近我尝试用PyQt5、pygame和诱变剂制作一个音频播放器。这个程序运行得很好。但是当我播放一首歌曲并试图退出程序时,程序停止响应,歌曲继续播放。但是当一首歌没有播放时,这种情况就不会发生了,因为它可以很好地工作 代码如下: from PyQt5 import QtWidgets, QtGui from PyQt5.QtWidgets import QApplication, QMainWindow, QSlider from PyQt5.QtGui import QColor fro

所以,最近我尝试用PyQt5、pygame和诱变剂制作一个音频播放器。这个程序运行得很好。但是当我播放一首歌曲并试图退出程序时,程序停止响应,歌曲继续播放。但是当一首歌没有播放时,这种情况就不会发生了,因为它可以很好地工作

代码如下:

from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QSlider
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qt
import sys
import pygame as pg
from mutagen.mp3 import MP3
import os
import threading

pg.init()

#33206

class window(QMainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(425, 65, 400, 190)
        self.setWindowIcon(QtGui.QIcon("icon"))
        self.setWindowTitle("MultiMedia Player")

        # MenuBar
        file = QtWidgets.QAction("&Open Mp3", self)
        file.setShortcut("Ctrl + O")
        file.triggered.connect(self.open_mp3)

        # Quit
        quit = QtWidgets.QAction("&Quit", self)
        quit.setShortcut("Q")
        quit.triggered.connect(self.close_app)

        # Add Items

        items = QtWidgets.QAction("&Add Items", self)
        items.setShortcut("Ctrl + P")

        mainmenu = self.menuBar()
        filemenu = mainmenu.addMenu("&Open")
        filemenu.addAction(file)
        add_items = mainmenu.addMenu("&Add Items")
        add_items.addAction(items)
        filemenu.addAction(quit)

        self.flag = 0

        self.home()

    def home(self):

        # colors
        black = (13, 13, 13)
        light_black = (36, 36, 36)

        # Pause Button
        self.pause_btn = QtWidgets.QPushButton(self)
        self.pause_btn.setText("Pause")
        self.pause_btn.setShortcut("p")
        self.pause_btn.move(0, 120)
        self.pause_btn.clicked.connect(self.pause)

        # Play Button
        self.play_btn = QtWidgets.QPushButton(self)
        self.play_btn.setText("Play")
        self.play_btn.setShortcut("Space")
        self.play_btn.move(150, 120)
        self.play_btn.clicked.connect(self.play)

        # Stop Button
        self.stop_btn = QtWidgets.QPushButton(self)
        self.stop_btn.setText("Stop")
        self.stop_btn.setShortcut("s")
        self.stop_btn.move(300, 120)

        self.stop_btn.clicked.connect(self.stop)
        # color for the window

        color = QColor(70, 70, 70)

        # Volume_Up Button
        self.vup_btn = QtWidgets.QPushButton(self)
        self.vup_btn.setText("V(+)")
        self.vup_btn.setShortcut("+")
        self.vup_btn.move(300, 160)
        self.vup_btn.clicked.connect(self.volume_up)


        # Volume_Down Button
        self.vdown_btn = QtWidgets.QPushButton(self)
        self.vdown_btn.setText("V(-)")
        self.vdown_btn.setShortcut("-")
        self.vdown_btn.move(0, 160)
        self.vdown_btn.clicked.connect(self.volume_down)


        # Seek Slider

        self.slider = QSlider(Qt.Horizontal, self)
        self.slider.setGeometry(20, 75, 350, 20)

        # Volume Slider

        self.v_slider = QSlider(Qt.Horizontal, self)
        self.v_slider.setGeometry(120, 165, 160, 20)
        self.v_slider.setMinimum(0)
        self.v_slider.setMaximum(100)
        self.v_slider.setValue(70)
        self.volume_value = self.v_slider.value()
        self.v_slider.valueChanged.connect(self.slider_value_changed)
        print(self.v_slider.value() / 100)



    def msg(self, title, message):
        msg1 = QtWidgets.QMessageBox()
        msg1.setWindowIcon(QtGui.QIcon("icon"))
        msg1.setWindowTitle(title)
        msg1.setText(message)
        msg1.setStandardButtons(QtWidgets.QMessageBox.Ok)
        msg1.exec_()


    def open_mp3(self):
        name = QtWidgets.QFileDialog.getOpenFileName(self)

        format = os.path.splitext(name[0])
        if format[1] == ".mp3":
            self.audio = MP3(name[0])
            self.duration = self.audio.info.length//1
            self.min = int(self.duration // 60)
            self.sec = int(self.duration % 60)

            self.total_time = str(self.min) + ":" + str(self.sec)
            print(self.total_time)

            self.slider.setMaximum(self.duration)
            self.slider.setMinimum(0)
            time = []
            time.append(self.total_time)
            self.label = QtWidgets.QLabel(self)
            self.label.setText(self.total_time)
            self.label.setFont(QtGui.QFont("Arial", 9))
            self.label.adjustSize()
            self.label.move(373, 77)

            song = name[0]
            pg.mixer.music.load(song)
            pg.mixer.music.play(1)
            pg.mixer.music.set_volume(self.v_slider.value()/100)

            self.label = QtWidgets.QLabel(self)
            self.label.setText(song)
            self.label.setFont(QtGui.QFont("Arial", 15))
            self.label.adjustSize()
            self.label.move(0, 36)
            self.label.show()
            threading_1 = threading.Thread(target=self.cur_time).start()

        else:
            self.msg("Invalid Format", "Choose A .Mp3 File Only!")

    volume_level = pg.mixer.music.get_volume()
    print(volume_level)

    def cur_time(self):

        true = 1
        while true == 1:
            if self.flag == 0:
                self.m_time = pg.mixer.music.get_pos()
                self.mm_time = self.m_time * 0.001
                self.s_time = self.mm_time // 1
                self.slider.setValue(self.s_time)
                print(self.s_time)
                self.slider.sliderMoved.connect(self.seek_changed)
            if self.s_time == -1:
                self.slider.setValue(0)
                true = 2

            if self.flag == 1:
                print(self.s_time)

    def seek_changed(self):
        print(self.slider.value())
        pg.mixer.music.set_pos(self.slider.value())

    def slider_value_changed(self):
        self.volume_value = self.v_slider.value()
        pg.mixer.music.set_volume(self.v_slider.value()/100)

    def volume_up(self):
        self.volume_value = self.volume_value + 10
        self.v_slider.setValue(self.volume_value)

        if self.volume_value >= 100:
            self.volume_value = 100


        pg.mixer.music.set_volume(self.v_slider.value() / 100)
        print(self.v_slider.value() / 100)


    def volume_down(self):
        self.volume_value = self.volume_value - 10
        self.v_slider.setValue(self.volume_value)

        if self.volume_value <= 0:
            self.volume_value = 0
        pg.mixer.music.set_volume(self.v_slider.value() / 100)
        print(self.v_slider.value() / 100)


    def pause(self):
        pg.mixer.music.pause()
        self.flag = 1

    def stop(self):
        pg.mixer.music.stop()
        self.flag = -1

    def play(self):

        pg.mixer.music.unpause()
        self.flag = 0


    def close_app(self):
        choice = QtWidgets.QMessageBox.question(
            self, "QUIT", "You Sure You Wanna Quit?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        if choice == QtWidgets.QMessageBox.Yes:
            sys.exit()
        else:
            pass




    def items(self):
        layout = QtWidgets.QVBoxLayout(self)
        song_name = QtWidgets.QFileDialog.getOpenFileName(self)

        widget = QtWidgets.QListWidget()
        widget.setAlternatingRowColors(True)
        widget.setDragDropMode(
            QtWidgets.QAbstractItemView.InternalMove)

        widget.addItems([str(i) for i in range(1, 6)])
        layout.addWidget(widget)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = window()
    win.show()
    sys.exit(app.exec_())
从PyQt5导入QtWidgets,QtGui
从PyQt5.QtWidgets导入QApplication、QMainWindow、QSlider
从PyQt5.QtGui导入QColor
从PyQt5.QtCore导入Qt
导入系统
导入pygame作为pg
从诱变剂.mp3导入mp3
导入操作系统
导入线程
第init页()
#33206
类窗口(QMainWindow):
定义初始化(自):
超级(窗口,自我)。\uuuu初始化
自我设置几何(42565400190)
self.setWindowIcon(QtGui.QIcon(“图标”))
self.setWindowTitle(“多媒体播放器”)
#梅努巴
file=qtwidts.QAction(&openmp3),self)
file.setShortcut(“Ctrl+O”)
file.triggered.connect(self.open_mp3)
#退出
quit=qtwidts.QAction(&quit),self)
退出。设置短切(“Q”)
退出。触发。连接(self.close_应用程序)
#添加项目
items=qtwidts.QAction(&additems),self)
项目.设置短切(“Ctrl+P”)
mainmenu=self.menuBar()
filemenu=mainmenu.addMenu(“&Open”)
filemenu.addAction(文件)
add_items=main menu.addMenu(“&additems”)
添加项目。添加操作(项目)
filemenu.addAction(退出)
self.flag=0
self.home()
def主页(自我):
#颜色
黑色=(13,13,13)
浅黑色=(36,36,36)
#暂停按钮
self.pause\u btn=qtwidts.QPushButton(self)
self.pause\u btn.setText(“暂停”)
自暂停设置短切(“p”)
自我暂停移动(0,120)
self.pause\u btn.单击.connect(self.pause)
#播放按钮
self.play_btn=qtwidts.QPushButton(self)
self.play_btn.setText(“play”)
自我播放设置短切(“空间”)
自我游戏移动(150120)
self.play\u btn.clicked.connect(self.play)
#停止按钮
self.stop\u btn=qtwidts.QPushButton(self)
self.stop\u btn.setText(“停止”)
自停止设置短切(“s”)
自动停止移动(300120)
self.stop\u btn.单击.connect(self.stop)
#窗户的颜色
颜色=QColor(70,70,70)
#音量上升按钮
self.vup_btn=qtwidts.QPushButton(self)
self.vup_btn.setText(“V(+)”)
self.vup_btn.setShortcut(“+”)
自行移动(300160)
self.vup\u btn.clicked.connect(self.volume\u up)
#音量下降按钮
self.vdown_btn=qtwidts.QPushButton(self)
self.vdown_btn.setText(“V(-))
self.vdown_btn.setShortcut(“-”)
自vdown_btn.移动(0,160)
self.vdown\u btn.clicked.connect(self.volume\u down)
#寻道滑块
self.slider=QSlider(Qt.Horizontal,self)
self.slider.setGeometry(20,75,350,20)
#音量滑块
self.v_滑块=QSlider(Qt.Horizontal,self)
self.v_滑块设置几何体(120、165、160、20)
self.v_滑块设置最小值(0)
self.v_滑块设置最大值(100)
self.v_滑块设置值(70)
self.volume\u value=self.v\u slider.value()
self.v\u slider.valueChanged.connect(self.slider\u value\u changed)
打印(self.v_slider.value()/100)
def消息(自我、标题、消息):
msg1=qtwidts.QMessageBox()
msg1.setWindowIcon(QtGui.QIcon(“图标”))
msg1.setWindowTitle(标题)
msg1.setText(消息)
msg1.setStandardButtons(qtwidts.QMessageBox.Ok)
msg1.exec_uz()
def open_mp3(自):
name=qtwidts.QFileDialog.getOpenFileName(self)
format=os.path.splitext(名称[0])
如果格式[1]=“.mp3”:
self.audio=MP3(名称[0])
self.duration=self.audio.info.length//1
self.min=int(self.duration//60)
self.sec=int(self.duration%60)
self.total_time=str(self.min)+“:”+str(self.sec)
打印(总打印时间)
self.slider.setMaximum(self.duration)
self.slider.setMinimum(0)
时间=[]
追加时间(自身总时间)
self.label=qtwidts.QLabel(self)
self.label.setText(self.total_time)
self.label.setFont(QtGui.QFont(“Arial”,9))
self.label.adjustSize()
self.label.move(37373777)
宋=名称[0]
pg.混音器.音乐.加载(歌曲)
pg.混音器.音乐.播放(1)
pg.mixer.music.set_volume(self.v_slider.value()/100)
self.label=qtwidts.QLabel(self)
self.label.setText(歌曲)
self.label.setFont(QtGui.QFont(“Arial”,15))
self.label.adjustSize()
self.label.move(0,36)
self.label.show()
threading_1=threading.Thread(target=self.cur_time).start()
其他:
self.msg(“格式无效”,“仅选择.Mp3文件!”)
音量水平=pg.mixer.music.get\u音量()
打印(卷级)
def cur_时间(自身):
真=1
而true==1:
如果self.flag==0:
self.m_time=pg.mixer.music.get_pos()
self.mm\u时间=self.m\u时间*0.001
self.s_time=self.mm_time//1
self.slider.setValue(self.s_时间)
打印(self.s_时间)
self.slider.sliderMoved.connect(self.seek\u已更改)
如果self.s_time==-1:
self.slider.setValue(0)
真=2
如果self.flag==1:
打印(self.s_时间)
def seek_已更改(自身):
打印(self.slider.value())
pg.mixer.music.set_pos(self.slider.value())
def滑块_值_已更改(自身):
self.volume\u value=self.v\u slider.value()
pg.混音器.音乐.设置音量(选择
    # create a timer in the window __init__
    self.cursor_updater = QtCore.QTimer(interval=100, timeout=self.cur_time)

    #...
    def cur_time(self):
        # ignore the update if the user is seeking
        if self.slider.isSliderDown():
            return
        self.slider.setValue(pg.mixer.music.get_pos() * .001)