更新滑块值会不断使程序崩溃 - python

也许我在这里完全错了,我正在尝试制作mp3播放器的“时间轴”。一切正常,我尝试将滑块设置为一个值,这很好。我的问题是,当我尝试更新时间轴时,它会一直冻结程序,并且不会解冻。这是我的代码,我从遇到问题的地方注释了从哪里开始看:

import sys
from PyQt5.QtCore import QCoreApplication, Qt
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, 
    QSlider
import vlc

player = vlc.MediaPlayer("/songs/Immigrant Song.mp3")

class window(QMainWindow):    
    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 400, 200)
        self.setWindowTitle('SlugPlayer')
        #self.setWindowIcon(QIcon('pic.png'))

        self.home()

    def home(self):
        playing = 0
        btn = QPushButton('quit', self)
        btn.clicked.connect(self.close_application)

        btn.resize(btn.sizeHint())  #set to acceptable size automatic
        btn.move(0, 0)

        playbtn = QPushButton('Play', self)
        # playbtn.clicked.connect(self.update_bar, playing)
        playbtn.clicked.connect(self.play_music, playing)
        playbtn.resize(playbtn.sizeHint())
        playbtn.move(100, 0)

        psebtn = QPushButton('Pause', self)

        psebtn.clicked.connect(self.pause_music, playing)

        psebtn.resize(psebtn.sizeHint())
        psebtn.move(200, 0)

        stopbtn = QPushButton('Stop', self)

        stopbtn.clicked.connect(self.stop_music, playing)

        stopbtn.resize(stopbtn.sizeHint())
        stopbtn.move(300, 0)

        self.sl = QSlider(Qt.Horizontal, self)
        self.sl.setFocusPolicy(Qt.NoFocus)
        self.sl.setGeometry(30, 50, 300, 20)
        self.sl.setMinimum(0)
        self.sl.setMaximum(100)
        self.sl.setValue(0)
        self.sl.move(50, 100)

        # self.sl.valueChanged[int].connect(self.print_value)
        self.show()

    def close_application(self):
        sys.exit()

    #here is where I'm trying to update the bar
    def play_music(self, playing):
        player.play()
        playing = 1
        while playing == 1: 
            self.update_bar(playing)



    def pause_music(self, playing):
        player.pause()
        playing = 0

    def stop_music(self, playing):
        player.stop()
        playing = 0

    def print_value(self, value):
        print(value)

    #function to update the bar (converts to an int)
    def update_bar(self, playing):
        self.sl.setValue(int(player.get_position() * 100))

def run():
    app = QApplication(sys.argv)
    Gui = window()
    sys.exit(app.exec_())


run()

参考方案

while playing == 1这样的无限循环会冻结GUI,因为它不允许您执行其他任务,在这种情况下,最好使用QTimer。更进一步地讲,我实现了一个类,该类负责在必要时通过发送信号来管理播放器。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import vlc

class VLCManager(QtCore.QObject):
    durationChanged = QtCore.pyqtSignal(int)
    positionChanged = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(VLCManager, self).__init__(parent)
        self._player = vlc.MediaPlayer()
        self._timer = QtCore.QTimer(self, interval=100, timeout=self.update_values)

    def setFileName(self, filename):
        self._player = vlc.MediaPlayer(filename)

    def position(self):
        self.durationChanged.emit(self.duration())
        return self._player.get_time()

    def setPosition(self, time):
        if self.position() != time:
            self._player.set_time(time)

    @QtCore.pyqtSlot()
    def update_values(self):
        self.positionChanged.emit(self.position())

    def duration(self):
        return self._player.get_length()

    @QtCore.pyqtSlot()
    def play(self):
        self._player.play()
        self.update_values()
        self._timer.start()

    @QtCore.pyqtSlot()
    def pause(self):
        self._player.pause()
        self.update_values()
        self._timer.stop()

    @QtCore.pyqtSlot()
    def stop(self):
        self._player.stop()
        self.update_values()
        self._timer.stop()


class window(QtWidgets.QMainWindow):    
    def __init__(self):
        super(window, self).__init__()
        self._manager = VLCManager(self)
        self._manager.setFileName("/songs/Immigrant Song.mp3")
        self.setWindowTitle('SlugPlayer')
        self.home()

    def home(self):
        quitbtn = QtWidgets.QPushButton('quit')
        quitbtn.clicked.connect(self.close)

        playbtn = QtWidgets.QPushButton('Play')
        playbtn.clicked.connect(self._manager.play)

        psebtn = QtWidgets.QPushButton('Pause', self)
        psebtn.clicked.connect(self._manager.pause)

        stopbtn = QtWidgets.QPushButton('Stop', self)
        stopbtn.clicked.connect(self._manager.stop)

        self.sl = QtWidgets.QSlider(orientation=QtCore.Qt.Horizontal)
        self.sl.setFocusPolicy(QtCore.Qt.NoFocus)
        self._manager.durationChanged.connect(self.sl.setMaximum)
        self._manager.positionChanged.connect(self.sl.setValue)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QVBoxLayout(central_widget)

        hlay = QtWidgets.QHBoxLayout()
        for b in (quitbtn, playbtn, psebtn, stopbtn, ):
            hlay.addWidget(b)
        lay.addLayout(hlay)
        lay.addWidget(self.sl)
        self.sl.valueChanged[int].connect(self._manager.setPosition)
        self.show()

def run():
    app = QtWidgets.QApplication(sys.argv)
    Gui = window()
    sys.exit(app.exec_())

run()

python中类初始化的最佳实践 - python

嗨,我想知道最佳实践是在python中初始化类,同时确保我的属性具有正确的数据类型。我应该使用默认值初始化类属性还是调用检查功能?class Foo: # Call with default value def __init__(self, bar=""): self._bar = bar # Calling set-function d…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

如何在PyQt4的动态复选框列表中检查stateChanged - python

所以我要从PyQt4的列表中添加复选框。但是我找不到在Window类中对每个状态使用stateChanged的方法。这是从列表元素添加它们的功能: def addCheckbox(self): colunas = Graphic(self.caminho).getColunas() for col in colunas: c = QtGui.QCheckBo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…