Python 如何在PyQt5中集成youtube dl

Python 如何在PyQt5中集成youtube dl,python,pyqt5,youtube-dl,Python,Pyqt5,Youtube Dl,我试图在gui中显示下载的实时进度。我在cmd中获得下载的实时进度,但gui仅在下载完成后更新 def myhook(self,d): self.percentage=QLabel(self) self.d=d if self.d['status']=='finished': print("finished") if self.d['status']=='downloading': print(self.d['f

我试图在gui中显示下载的实时进度。我在cmd中获得下载的实时进度,但gui仅在下载完成后更新

def myhook(self,d):
    self.percentage=QLabel(self)
    self.d=d
    if self.d['status']=='finished':
        print("finished")
    if self.d['status']=='downloading':
        print(self.d['filename'],self.d['total_bytes'],self.d['downloaded_bytes'],self.d['elapsed'],self.d['eta']
        ,str(str(self.d['speed']/1000)[0:5]+'KiB/s')
        ,str((self.d['downloaded_bytes']*100)/self.d['total_bytes'])[0:5]+'%')
        if self.d['total_bytes']>1048576:
            total_size=self.d['total_bytes']/1048576
            total_size=str(total_size)[0:5]+' MB'
        if self.d['total_bytes']>1073741824:
            total_size=self.d['total_bytes']/1073741824
            total_size=str(total_size)[0:5]+' GB'
        self.percentage.setText('{} {}'.format(total_size
        ,str((self.d['downloaded_bytes']*100)/self.d['total_bytes'])[0:5]+' %'))
        self.percentage.setStyleSheet('color:white;border-bottom:2px solid orange;')
        self.percentage.setFont(QFont('Arial',15))
        self.percentage.resize(500,30)
        self.percentage.move(320,650)
        self.percentage.show()

    self.url=self.urlfield.text()
    print("144p")
    options={'format':'bestvideo[height=144]+bestaudio/best','noplaylist':True,'postprocessors':[{'key':'FFmpegMetadata'}]
    ,'noprogress':True,'progress_hooks':[self.myhook]}
    with youtube_dl.YoutubeDL(options) as ydll:
        ydll.download(['{}'.format(self.url)])
由于您多次想知道从youtube dl获取信息并在用pyqt5编写的GUI中显示信息的正确方法是什么,因此我将获得许可证以超越当前问题,并展示一个更通用的示例

youtube_dl下载方法非常耗时,因此不应在主线程中执行,因为它会产生不必要的效果,如窗口冻结。另一方面,youtube_dl提供了两种信息方式:挂钩和记录器。这些媒体与下载方法在同一线程中执行,因此不应直接访问它们,而应通过信号访问它们

qyoutubedl.py

导入线程
从PyQt5导入QtCore
导入youtube\u dl
QLogger类(QtCore.QObject):
messageChanged=QtCore.pyqtSignal(str)
def调试(self,msg):
self.messageChanged.emit(msg)
def警告(自我,消息):
self.messageChanged.emit(msg)
def错误(self,msg):
self.messageChanged.emit(msg)
QHook类(QtCore.QObject):
infoChanged=QtCore.pyqtSignal(dict)
定义调用(self,d):
self.infoChanged.emit(d.copy())
QYoutubeDL类(QtCore.QObject):
def下载(自身、URL、选项):
穿线,穿线(
target=self.\u execute,args=(URL,选项),daemon=True
).start()
def_execute(self、url、选项):
使用youtube_dl.YoutubeDL(选项)作为ydl:
下载(网址)
对于hook-in-options.get(“progress\u-hooks”,[]):
如果存在(挂钩、QHook):
hook.deleteLater()
logger=options.get(“logger”)
如果isinstance(记录器、QLogger):
logger.deleteLater()
main.py

从PyQt5导入QtWidgets
从qyoutubedl导入QLogger、QHook、qyoutubedl
从hurse.filesize导入大小
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.url_le=QtWidgets.QLineEdit()
self.download\u btn=qtwidts.QPushButton(self.tr(“下载”))
self.progress\u lbl=qtwidts.QLabel()
self.download_pgb=qtwidts.QProgressBar()
self.log_edit=QtWidgets.QPlainTextEdit(readOnly=True)
central_widget=qtwidts.QWidget()
self.setCentralWidget(中心窗口小部件)
lay=qtwidts.QGridLayout(中心小部件)
lay.addWidget(qtwidts.QLabel(self.tr(“url:”))
lay.addWidget(self.url_le,0,1)
lay.addWidget(self.download_btn,0,2)
lay.addWidget(self.progress\u lbl,1,1,1,2)
lay.addWidget(self.download_pgb,2,1,1,2)
lay.addWidget(self.log\u edit,3,1,1,2)
self.progress\u lbl.hide()
self.downloader=QYoutubeDL()
self.download\u btn.clicked.connect(self.download)
self.url_le.setText(“https://www.youtube.com/watch?v=BaW_jenozKc")
自我调整大小(640480)
def下载(自助):
qhook=qhook()
qlogger=qlogger()
url=self.url\u le.text()
选项={
“格式”:“最佳视频[高度=144]+最佳音频/最佳”,
“noplaylist”:正确,
“后处理器”:[{“键”:“FFmpegMetadata”}],
“无进展”:没错,
“记录器”:qlogger,
“进度挂钩”:[qhook],
}
self.downloader.download([url],选项)
qhook.infoChanged.connect(self.handle\u info\u changed)
qlogger.messageChanged.connect(self.log\u edit.appendPlainText)
self.download_pgb.setRange(0,1)
def句柄信息已更改(自身,d):
如果d[“状态”]=“正在下载”:
self.progress\u lbl.show()
总计=d[“总计字节”]
下载=d[“下载的字节”]
self.progress_lbl.setText(“{}of{}.”格式(大小(下载),大小(总数)))
self.download_pgb.setMaximum(总计)
self.download_pgb.setValue(已下载)
def main():
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 show()
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()

非常感谢,这非常有帮助。如果我遇到任何问题,我会告诉你。