首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何用pafy制作进度条的线程

如何用pafy制作进度条的线程
EN

Stack Overflow用户
提问于 2019-01-04 14:55:11
回答 1查看 1K关注 0票数 2

我正在尝试修复我的程序中的问题,这个问题是当我开始下载视频时,程序没有响应,我看不到进度条移动,所以我尝试使用线程模块,但我不能修复问题,所以我如何解决问题

从这段代码中,我可以下载视频并将数据发送到另一个函数,以检索用于将其连接到进度条的信息

代码语言:javascript
运行
AI代码解释
复制
def video(self):
    video_url = self.lineEdit_4.text()
    video_save = self.lineEdit_3.text()

    pafy_video = pafy.new(video_url)
    type_video = pafy_video.videostreams

    quality = self.comboBox.currentIndex()

    start_download = type_video[quality].download(filepath=video_save,callback=self.video_progressbar)

此代码是从视频功能接收到的信息与进度条连接

代码语言:javascript
运行
AI代码解释
复制
def video_progressbar(self,total, recvd, ratio, rate, eta):
    self.progressBar_2.setValue(ratio * 100)

我使用;python3.5 pyqt5 pafy

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-04 16:50:54

转移到另一个线程的一种方法是创建一个驻留在另一个线程中的QObject,并在一个插槽中执行该任务。并且该槽必须通过QMetaObject::invokeMethod或信号来调用。

with QThread and QMetaObject::invokeMethod:

代码语言:javascript
运行
AI代码解释
复制
import pafy
from PyQt5 import QtCore, QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        self.le_url = QtWidgets.QLineEdit("https://www.youtube.com/watch?v=bMt47wvK6u0")
        path = QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.DownloadLocation)
        self.le_output = QtWidgets.QLineEdit(path)
        self.btn_quality = QtWidgets.QPushButton("Get qualities")
        self.combo_quality = QtWidgets.QComboBox()
        self.btn_download = QtWidgets.QPushButton("Download")
        self.progressbar = QtWidgets.QProgressBar(maximum=100)

        self.downloader = DownLoader()
        thread = QtCore.QThread(self)
        thread.start()
        self.downloader.moveToThread(thread)

        self.btn_quality.clicked.connect(self.on_clicked_quality)
        self.btn_download.clicked.connect(self.download)
        self.btn_download.setDisabled(True)
        self.downloader.progressChanged.connect(self.progressbar.setValue)
        self.downloader.qualitiesChanged.connect(self.update_qualityes)
        self.downloader.finished.connect(self.on_finished)

        form_lay = QtWidgets.QFormLayout(central_widget)
        form_lay.addRow("Url: ", self.le_url)
        form_lay.addRow(self.btn_quality)
        form_lay.addRow("qualities: ", self.combo_quality)
        form_lay.addRow("Output: ", self.le_output) 
        form_lay.addRow(self.btn_download)  
        form_lay.addRow(self.progressbar)

    @QtCore.pyqtSlot()
    def on_finished(self):
        self.update_disables(False)

    @QtCore.pyqtSlot()
    def on_clicked_quality(self):
        video_url = self.le_url.text()
        QtCore.QMetaObject.invokeMethod(self.downloader, "get_qualities",
            QtCore.Qt.QueuedConnection,
            QtCore.Q_ARG(str, video_url))

    @QtCore.pyqtSlot(list)
    def update_qualityes(self, types_of_video):
        for t in types_of_video:
            self.combo_quality.addItem(str(t), t)
        self.btn_download.setDisabled(False)

    @QtCore.pyqtSlot()
    def download(self):
        video_save = self.le_output.text()
        d = self.combo_quality.currentData()
        QtCore.QMetaObject.invokeMethod(self.downloader, "start_download",
            QtCore.Qt.QueuedConnection,
            QtCore.Q_ARG(object, d),
            QtCore.Q_ARG(str, video_save))
        self.update_disables(True)

    def update_disables(self, state):
        self.combo_quality.setDisabled(state)
        self.btn_quality.setDisabled(state)
        self.le_output.setDisabled(state)
        self.le_url.setDisabled(state)
        self.btn_download.setDisabled(not state)

class DownLoader(QtCore.QObject):
    progressChanged = QtCore.pyqtSignal(int)
    qualitiesChanged = QtCore.pyqtSignal(list)
    finished = QtCore.pyqtSignal()

    @QtCore.pyqtSlot(str)
    def get_qualities(self, video_url):
        pafy_video = pafy.new(video_url)
        types_of_video = pafy_video.allstreams # videostreams
        self.qualitiesChanged.emit(types_of_video)

    @QtCore.pyqtSlot(object, str)
    def start_download(self, d, filepath):
        d.download(filepath=filepath, callback=self.callback)

    def callback(self, total, recvd, ratio, rate, eta):
        val = int(ratio * 100)
        self.progressChanged.emit(val)
        if val == 100:
            self.finished.emit()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(320, 480)
    w.show()
    sys.exit(app.exec_())

with threading.Thread

代码语言:javascript
运行
AI代码解释
复制
import pafy
import threading
from PyQt5 import QtCore, QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    qualitiesChanged = QtCore.pyqtSignal(list)
    progressChanged = QtCore.pyqtSignal(int)
    finished = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        self.le_url = QtWidgets.QLineEdit("https://www.youtube.com/watch?v=bMt47wvK6u0")
        path = QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.DownloadLocation)
        self.le_output = QtWidgets.QLineEdit(path)
        self.btn_quality = QtWidgets.QPushButton("Get qualities")
        self.combo_quality = QtWidgets.QComboBox()
        self.btn_download = QtWidgets.QPushButton("Download")
        self.progressbar = QtWidgets.QProgressBar(maximum=100)

        self.btn_quality.clicked.connect(self.on_clicked_quality)
        self.btn_download.clicked.connect(self.download)
        self.btn_download.setDisabled(True)
        self.progressChanged.connect(self.progressbar.setValue)
        self.qualitiesChanged.connect(self.update_qualityes)
        self.finished.connect(self.on_finished)

        form_lay = QtWidgets.QFormLayout(central_widget)
        form_lay.addRow("Url: ", self.le_url)
        form_lay.addRow(self.btn_quality)
        form_lay.addRow("qualities: ", self.combo_quality)
        form_lay.addRow("Output: ", self.le_output) 
        form_lay.addRow(self.btn_download)  
        form_lay.addRow(self.progressbar)

    @QtCore.pyqtSlot()
    def on_finished(self):
        self.update_disables(False)

    @QtCore.pyqtSlot()
    def on_clicked_quality(self):
        video_url = self.le_url.text()
        threading.Thread(target=self.get_qualities, args=(video_url,)).start()

    def get_qualities(self, video_url):
        pafy_video = pafy.new(video_url)
        types_of_video = pafy_video.allstreams # videostreams
        self.qualitiesChanged.emit(types_of_video)

    @QtCore.pyqtSlot(list)
    def update_qualityes(self, types_of_video):
        for t in types_of_video:
            self.combo_quality.addItem(str(t), t)
        self.btn_download.setDisabled(False)

    @QtCore.pyqtSlot()
    def download(self):
        video_save = self.le_output.text()
        d = self.combo_quality.currentData()
        threading.Thread(target=d.download, kwargs={'filepath': video_save, 'callback': self.callback}, daemon=True).start()

    def callback(self, total, recvd, ratio, rate, eta):
        print(ratio)
        val = int(ratio * 100)
        self.progressChanged.emit(val)
        if val == 100:
            self.finished.emit()

    def update_disables(self, state):
        self.combo_quality.setDisabled(state)
        self.btn_quality.setDisabled(state)
        self.le_output.setDisabled(state)
        self.le_url.setDisabled(state)
        self.btn_download.setDisabled(not state)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(320, 480)
    w.show()
    sys.exit(app.exec_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54041323

复制
相关文章
精品:TCP连接的建立和终止
TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。
看、未来
2020/08/26
7950
精品:TCP连接的建立和终止
TCP连接是如何建立和终止的?
服务器在客户端建立连接时刚好断电。可以看出客户端进行了重试,但是重试之间的时间间隔第一次是5.81秒,而第二次间隔是24.00秒。
爬蜥
2019/07/08
1.7K0
TCP连接是如何建立和终止的?
TCP连接异常终止(RST包)场景分析
TCP的异常终止是相对于正常释放TCP连接的过程而言的,我们都知道,TCP连接的建立是通过三次握手完成的,而TCP正常释放连接是通过四次挥手来完成。但是有些情况下,TCP在交互的过程中会出现一些意想不到的情况,导致TCP无法按照正常的三次握手建立连接或四次挥手来释放连接。如果此时不通过其他的方式来释放TCP连接的话,这个TCP连接将会一直存在,占用系统的资源。在这种情况下,我们就需要有一种能够释放TCP连接的机制,这种机制就是TCP的reset报文。reset报文是指TCP报头的标志字段中的reset位置一的报文,如下图所示:
全栈程序员站长
2022/11/15
4.5K0
TCP连接异常终止(RST包)场景分析
【Mac】APP无法打开或文件损坏的处理方法
在 MAC 下安装一些软件时提示”来自身份不明开发者“,其实这是MAC新系统启用了新的安全机制。 默认只信任 Mac App Store 下载的软件和拥有开发者 ID 签名的应用程序。
redszhao
2021/08/09
1.3K0
【Mac】APP无法打开或文件损坏的处理方法
mac 无法打开22端口 无法远程连接ssh 的解决办法
mac 无法远程连接 原因是22端口没有打开 尝试通过命令行打开22端口 依然失败!! 解决办法:手动设置 ①打开系统偏好设置-共享 ②勾选远程登录并添加用户 现在再试一下远程ssh ,已经可以成功连接了!
小黑同学
2021/12/06
3.8K0
mac 无法打开22端口 无法远程连接ssh 的解决办法
windows10无法打开onedrive-打开onedrive提示文件或目录损坏且无法读取
今天电脑开机,发现onedrive没有随着开机自启,于是在搜索栏搜到onedrive应用,手动点击,没有任何反应
承世
2023/04/07
7.1K0
windows10无法打开onedrive-打开onedrive提示文件或目录损坏且无法读取
PHP curl或file_get_contents下载图片损坏或无法打开
通过curl或者file_get_contents获取抓取远程图片并且保存到本地,发现损坏了很多图片,比如访问
超级小可爱
2023/02/20
1.4K0
Mac应用程序无法打开或文件损坏的处理方法
错误截图 当遇到这种情况,真的损坏了么?是不是真的要移动到废纸篓呢?遇到这样的情况,通常是打开任何来源即可轻松解决,下面讲一下Mac应用程序无法打开或文件损坏的处理方法,解答Mac没有任
骤雨重山
2022/05/30
3.9K0
Mac应用程序无法打开或文件损坏的处理方法
内存或磁盘空间不足,excel无法再次打开_打开文件显示内存或磁盘空间不足
在网络上下载的文件,使用EXCEL打开的时候提示“内存或磁盘空间不足,Microsoft Excel 无法再次打开或保存任何文档。”,针对这个问题,装机之家小编特地在网上搜罗了具体解决方法,但是网上提供的增加虚拟内存的方法,并不能解决该问题,不过经过小编琢磨,终于找到能够解决该问题的方法,下面装机之家分享一下内存或磁盘空间不足 excel无法再次打开解决方法,来看看吧!
全栈程序员站长
2022/09/21
5.5K0
内存或磁盘空间不足,excel无法再次打开_打开文件显示内存或磁盘空间不足
Python代理无法连接或连接不稳定故障排除指南
在使用Python进行网络爬虫或访问外部资源时,经常会遇到代理无法连接或连接不稳定的问题。本文将提供一份详细的故障排除指南,帮助你解决Python代理连接问题,确保顺利进行网络操作。
华科云商小彭
2023/08/25
4790
Python代理无法连接或连接不稳定故障排除指南
localhost或127.0.0.1无法连接到mysql的解决方案
在my.ini文件中加入bind-address = 127.0.0.1便可解决该问题
wuweixiang
2018/08/14
3.9K0
localhost或127.0.0.1无法连接到mysql的解决方案
java中跳出或终止if语句的方法
break:跳出当前循环;但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环。
Java架构师必看
2021/12/21
5.6K1
Android检测网络是否可用并打开、扫描、连接WIFI
需求:要求先检查网络是否可用,如果可用就跳过网络设置界面,如果不可用就打开WIFI并扫描网络后去手动输入密码连接
程序员飞飞
2020/02/27
2.9K0
[TCP] tcp连接SYN超时重传次数和超时时间
当tcp进行三次握手的时候 , 第一步是客户端发送syn请求 , 服务端返回syn+sck , 客户端响应sck
唯一Chat
2021/04/22
8.8K0
SaveFileDialog无法打开
当前画面是报表画面,没用线程。主画面点击按钮,打开该画面,是在子线程中打开的,所以SaveFileDialog也无法直接打开
全栈程序员站长
2022/11/10
2K0
IReport无法打开的原因
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说IReport无法打开的原因,希望能够帮助大家进步!!!
Java架构师必看
2021/11/30
2.3K0
IReport无法打开的原因
matlab中importdata无法打开文件_importdata无法打开文件
最近使用importdata函数不能读取全部数据,数据集315行,但是读取了197行,那就是197-198之间有问题,百度之后有了思路。由于没有找到具体的证据,所以这里说一下解决思路。
全栈程序员站长
2022/11/16
6.4K0
matlab中importdata无法打开文件_importdata无法打开文件
Visual Studio 2017 “无法查找或打开PDB文件“ 解决方法
我这儿选择使用http://msdl.microsoft.com/download/symbols,然后选择路径。
全栈程序员站长
2022/08/22
6.7K1
Visual Studio 2017 “无法查找或打开PDB文件“ 解决方法
点击加载更多

相似问题

检测TCP连接丢失的时间

23

TCP连接终止

10

终止连接TCP

13

终止现有tcp连接

21

Ruby on Rails:无法打开TCP连接

28
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档