如何将 youtube-dl 日志输出到 Pyqt 文本框

How to output youtube-dl log to Pyqt textbox

我尝试创建一个简单的 PyQt Gui 来使用 url 下载 youtube 视频。一切正常,除了我想在 PyQt 的文本框中输出 youtube-dl 日志的部分。当我这样做时,文本框中没有显示任何内容。

我创建了一个名为 MyLogger() 的 class:

class MyLogger(object):

    def debug(self, msg):
        GUI.e2.setText(str(msg))


    def warning(self, msg):
        GUI.e2.setText(str(msg))


    def error(self, msg):
        GUI.e2.setText(str(msg))

此 class 使用 ydl_opts 传递给 youtube_dl.YoutubeDL:

ydl_opts = {'format':'140','logger':MyLogger()}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download([url])

GUI 是 QtGui.QMainWindow 的实例,e2 是 QtGui.QLineEdit()

的实例

如果您能帮助解决为什么这不起作用,或者可能有其他方法可以做到这一点,我们将不胜感激。谢谢!

首先,下载必须在另一个线程中执行,因为这个任务非常耗时,阻塞主线程。

另一方面,我认为更好的选择是使用 QTextEdit 而不是 QLineEdit,因为它可以显示多行信息。

要发送数据,您可以使用信号,如下所示:

import sys

from PyQt4 import QtCore, QtGui
import youtube_dl


class MyLogger(QtCore.QObject):
    messageSignal = QtCore.pyqtSignal(str)
    def debug(self, msg):
        self.messageSignal.emit(msg)

    def warning(self, msg):
        self.messageSignal.emit(msg)

    def error(self, msg):
        self.messageSignal.emit(msg)


class YoutubeDownload(QtCore.QThread):
    def __init__(self, url, ydl_opts, *args, **kwargs):
        QtCore.QThread.__init__(self, *args, **kwargs)
        self.url = url
        self.ydl_opts = ydl_opts

    def run(self):
        with youtube_dl.YoutubeDL(self.ydl_opts) as ydl:
            ydl.download([self.url])


class Widget(QtGui.QMainWindow):
    def __init__(self, *args, **kwargs):
        QtGui.QMainWindow.__init__(self, *args, **kwargs)
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        lay = QtGui.QVBoxLayout(self.centralWidget)
        url = "https://www.youtube.com/watch?v=R6zWLfHIYJw"
        self.urlLineEdit = QtGui.QLineEdit(url)
        self.messageTE = QtGui.QTextEdit()
        lay.addWidget(self.urlLineEdit)
        lay.addWidget(self.messageTE)
        self.urlLineEdit.editingFinished.connect(self.onEditingFinished)

    def onEditingFinished(self):
        url = str(self.urlLineEdit.text())
        if url != "":
            logger = MyLogger()
            logger.messageSignal.connect(self.messageTE.append)
            ydl_opts = {'format':'140','logger': logger}
            self.thread = YoutubeDownload(url, ydl_opts)
            self.thread.start()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())