pyqt5编程中遇到的与播放功能和进度条有关的问题

使用pyqt5开发音频波形demo,增加选区循环播放功能时进度条不更新。
问题相关代码

def loopregionplayer(self):#选区循环播放,暂时连接在stop按钮
self.loop_position.setRegion((0, 0))
self.ui.graph.plotItem.getViewBox().addItem(self.loop_position)

    # self.audio_play.setPosition(1000)#设置开始时间(毫秒)
    # self.audio_play.positionChanged()
    # time.sleep(2)
    # self.audio_play.positionChanged()
    self.ui.slider.blockSignals(True)
    self.ui.slider.setValue(1000)
    self.ui.slider.blockSignals(False)
    # print(self.audio_play.position())
    # time.sleep(3)
    self.audio_play.play()
    while True:
        
          
        print(self.audio_play.position())
        self.update_timestamp(self.audio_play.position(), self.ui.current_time, self.ui.slider)
        self.loop_position.setRegion((self.ui.slider.value()/1000, self.ui.slider.value()/1000))
        if self.ui.slider.value()>=5001:#终止判断条件

            self.audio_play.pause()
            break
        # self.ui.slider.setValue(self.audio_play.position())
        print(self.ui.slider.value())     
    
运行结果及报错内容

slider.value()和audio_play.position()的值都会更新但是进度条不会刷新

我的解答思路和尝试过的方法

暂时没有解决办法

我想要达到的结果

怎样在实现这个功能的基础上让进度条实现更新

完整代码如下
ui部分

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(782, 657)
        MainWindow.setMaximumSize(QtCore.QSize(800, 16777215))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.graph = PlotWidget(self.centralwidget)
        self.graph.setObjectName("graph")
        self.gridLayout.addWidget(self.graph, 0, 0, 1, 11)
        self.play_speed = QtWidgets.QComboBox(self.centralwidget)
        self.play_speed.setMaximumSize(QtCore.QSize(50, 20))
        self.play_speed.setEditable(False)
        self.play_speed.setObjectName("play_speed")
        self.play_speed.addItem("")
        self.play_speed.addItem("")
        self.play_speed.addItem("")
        self.play_speed.addItem("")
        self.play_speed.addItem("")
        self.play_speed.addItem("")
        self.gridLayout.addWidget(self.play_speed, 1, 10, 1, 1)
        self.current_time = QtWidgets.QLabel(self.centralwidget)
        self.current_time.setObjectName("current_time")
        self.gridLayout.addWidget(self.current_time, 1, 2, 1, 1)
        self.slider = QtWidgets.QSlider(self.centralwidget)
        self.slider.setOrientation(QtCore.Qt.Horizontal)
        self.slider.setObjectName("slider")
        self.gridLayout.addWidget(self.slider, 1, 3, 1, 1)
        self.stop = QtWidgets.QPushButton(self.centralwidget)
        self.stop.setMaximumSize(QtCore.QSize(50, 16777215))
        self.stop.setObjectName("stop")
        self.gridLayout.addWidget(self.stop, 2, 6, 1, 1)
        self.play = QtWidgets.QPushButton(self.centralwidget)
        self.play.setMaximumSize(QtCore.QSize(50, 16777215))
        self.play.setObjectName("play")
        self.gridLayout.addWidget(self.play, 2, 5, 1, 1)
        self.pause = QtWidgets.QPushButton(self.centralwidget)
        self.pause.setMaximumSize(QtCore.QSize(50, 16777215))
        self.pause.setObjectName("pause")
        self.gridLayout.addWidget(self.pause, 2, 4, 1, 1)
        self.total_time = QtWidgets.QLabel(self.centralwidget)
        self.total_time.setObjectName("total_time")
        self.gridLayout.addWidget(self.total_time, 1, 4, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 782, 23))
        self.menuBar.setObjectName("menuBar")
        self.menu = QtWidgets.QMenu(self.menuBar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menuBar)
        self.actionopen = QtWidgets.QAction(MainWindow)
        self.actionopen.setObjectName("actionopen")
        self.menu.addAction(self.actionopen)
        self.menuBar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.play_speed.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.play_speed.setCurrentText(_translate("MainWindow", "x1.0"))
        self.play_speed.setItemText(0, _translate("MainWindow", "x0.5"))
        self.play_speed.setItemText(1, _translate("MainWindow", "x0.75"))
        self.play_speed.setItemText(2, _translate("MainWindow", "x1.0"))
        self.play_speed.setItemText(3, _translate("MainWindow", "x1.25"))
        self.play_speed.setItemText(4, _translate("MainWindow", "x1.5"))
        self.play_speed.setItemText(5, _translate("MainWindow", "x2.0"))
        self.current_time.setText(_translate("MainWindow", "0:00"))
        self.stop.setText(_translate("MainWindow", "stop"))
        self.play.setText(_translate("MainWindow", "play"))
        self.pause.setText(_translate("MainWindow", "pause"))
        self.total_time.setText(_translate("MainWindow", "0:00"))
        self.menu.setTitle(_translate("MainWindow", "文件"))
        self.actionopen.setText(_translate("MainWindow", "open"))
from pyqtgraph import PlotWidget


功能部分

import sys, os, shutil
import matplotlib.pyplot as plt
from librosa.core.spectrum import _spectrogram
import numpy as np
import pyqtgraph as pg
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from datetime import datetime
import pyqtgraph
import pyqtgraph.exporters
import matplotlib.pyplot as plt
from MainWindow import Ui_MainWindow
import scipy.io.wavfile
import librosa.display
import time 

def time_stamp(ms):
    
    hours, remainder = divmod(ms, 3_600_000)
    minutes, remainder = divmod(remainder, 60_000)
    seconds, _ = divmod(remainder, 1_000)
    return ("%d:%02d:%02d" % (hours, minutes, seconds)) if hours else ("%d:%02d" % (minutes, seconds))

class MainWindow(qtw.QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.show()
      
        self.samples = None
        self.sampling_rate = None
        self.samples_after = None  
        self.data_line = None
        self.playback_position = None
        self.loop_position = pyqtgraph.LinearRegionItem(values=(0, 0))
        self.position=0

        self.audio_play = QMediaPlayer()
        self.player = QMediaPlayer()
        self.audio_play.setNotifyInterval(1)

        self.ui.actionopen.triggered.connect(self.open_audio)

        self.ui.play.clicked.connect(self.audio_play.play)
        self.ui.pause.clicked.connect(self.audio_play.pause)
        self.ui.stop.clicked.connect(self.loopregionplayer)#暂时测试功能
        self.audio_play.durationChanged.connect(lambda duration: self.update_duration(duration))
        self.ui.play_speed.currentIndexChanged.connect(lambda: self.audio_play.setPlaybackRate(float(self.ui.play_speed.currentText()[1:])))


        
    def open_audio(self):
        path = qtw.QFileDialog.getOpenFileName(None, 'Load Audio', './', "Audio File(*.wav)")[0]
        print(path)
        self.audio_play.setMedia(QMediaContent(qtc.QUrl.fromLocalFile(path)))
        self.audio_play.positionChanged.connect(lambda position: self.update_timestamp(position,self.ui.current_time,  self.ui.slider)) 
        # # self.audio_play.positionChanged.connect(self.PC)
        self.ui.slider.valueChanged.connect(self.audio_play.setPosition)
        self.sampling_rate, self.samples = scipy.io.wavfile.read(path)
        self.plot_graph(self.samples, self.sampling_rate)   
        
       
        
        
    def PC(self):#更新位置和当前显示时间
        return self.update_timestamp(self.audio_play.position(), self.ui.current_time, self.ui.slider)
                
    def plot_graph(self, samples, sampling_rate):#画图
        
        peak_value = np.amax(samples)
        normalized_data = samples / peak_value
        length = samples.shape[0] / sampling_rate
        time = list(np.linspace(0, length, samples.shape[0]))

        drawing_pen = pg.mkPen(color=(255, 0, 0), width=0.5)
        self.ui.graph.removeItem(self.data_line)
        self.data_line = self.ui.graph.plot(
            time, normalized_data, pen=drawing_pen)
        self.ui.graph.plotItem.setLabel(axis='left', text='Normalized Amplitude')
        self.ui.graph.plotItem.setLabel(axis='bottom', text='time [s]')
        self.ui.graph.plotItem.getViewBox().setLimits(xMin=0, xMax=np.max(time), yMin=-1.1, yMax=1.1)
        
        self.playback_position = pyqtgraph.LinearRegionItem(values=(0, 0))
        self.ui.graph.plotItem.getViewBox().addItem(self.playback_position)
       
    def update_timestamp(self, position,currentTimeLabel, timeSlider):#更新进度条
            if position >= 0:
                currentTimeLabel.setText(time_stamp(position))

            timeSlider.blockSignals(True)
            timeSlider.setValue(position)
            timeSlider.blockSignals(False)

            self.playback_position.setRegion((position/1000, position/1000))
            minRange, maxRange = self.ui.graph.plotItem.getAxis('bottom').range
            # if(position >= maxRange * 1000):
            #     self.ui.graph.plotItem.getViewBox().translateBy((maxRange-minRange), 0)
            #     #self.synchronize()

            # if(position <= minRange * 1000):
            #     self.ui.graph.plotItem.getViewBox().translateBy(-minRange)
            #     #self.synchronize()

    def update_duration(self, duration ):#更新总时长
        self.ui.slider.setMaximum(duration)

        if duration >= 0:
            self.ui.total_time.setText(time_stamp(duration))
        
   

    
    def loopregionplayer(self):#选区循环播放,暂时连接在stop按钮
        self.loop_position.setRegion((0, 0))
        self.ui.graph.plotItem.getViewBox().addItem(self.loop_position)
        
        # self.audio_play.setPosition(1000)#设置开始时间(毫秒)
        # self.audio_play.positionChanged()
        # time.sleep(2)
        # self.audio_play.positionChanged()
        self.ui.slider.blockSignals(True)
        self.ui.slider.setValue(1000)
        self.ui.slider.blockSignals(False)
        # print(self.audio_play.position())
        # time.sleep(3)
        self.audio_play.play()
        while True:
            
              
            print(self.audio_play.position())
            self.update_timestamp(self.audio_play.position(), self.ui.current_time, self.ui.slider)
            self.loop_position.setRegion((self.ui.slider.value()/1000, self.ui.slider.value()/1000))
            if self.ui.slider.value()>=5001:#终止判断条件

                self.audio_play.pause()
                break
            # self.ui.slider.setValue(self.audio_play.position())
            print(self.ui.slider.value())     
        
        
        

            
           
        
            

if __name__ == '__main__':
    
    app = qtw.QApplication(sys.argv)
    app.setStyle("Fusion")
    mw = MainWindow()
    sys.exit(app.exec_())