如何将 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_())
我尝试创建一个简单的 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_())