凌的博客

PyQt5 多线程下载文件(优化)

多线程 url pyqt
2019-08-25 python 2279

1.png

import sys

from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QLineEdit, QPushButton, QProgressBar, QDesktopWidget, \
    QTextEdit,QMessageBox,QFileDialog
import time, requests, os
from PyQt5.QtCore import QThread, pyqtSignal,Qt
from PyQt5.QtGui import QIcon


class WorkThread(QThread):
    trigger = pyqtSignal(int)
    trigger2 = pyqtSignal(str)
    url = ""
    basedir = "./"

    def __init__(self):
        super(WorkThread, self).__init__()

    def run(self):
        print("thread run..")
        url = self.url
        print("down file:" + url)
        path = os.path.join(self.basedir,os.path.basename(url))
        start = time.time()
        size = 0
        response = requests.get(url, stream=True)  # stream 必须带上
        chunk_size = 1024  # 每次下载大小
        content_size = int(response.headers['content-length'])
        if response.status_code == 200:
            print("[文件大小]:%.2f MB" % (content_size / chunk_size / 1024))
            with open(path, "wb") as file:
                for data in response.iter_content(chunk_size=chunk_size):
                    file.write(data)
                    size += len(data)  # 已下载大小

                    num = int(size / content_size * 100)
                    self.trigger.emit(num)
                    # \r 指定第一个字符开始,搭配end属性完成覆盖进度条
                    print("\r" + "[下载进度]:%s%.2f%%" % (
                        ">" * int(size * 50 / content_size), float(size / content_size * 100)), end="")

            end = time.time()  # 结束时间
            self.trigger2.emit("下载完成!用时%.2f秒" % (end - start))
            print("\n" + "全部下载完成!用时%.2f秒" % (end - start))



class DownLoad(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        #self.setWindowIcon(QIcon("web.png"))

        lbl = QLabel("请输入链接:", self)
        lbl.move(30, 30)
        lbl_xzd = QLabel("下载到:", self)
        lbl_xzd.move(30, 55)

        self.text_xz = QLineEdit("", self)
        self.text_xz.resize(350, 20)
        self.text_xz.move(100, 55)
        self.text_xz.setText(r"C:/Users/Administrator/Desktop")
        self.text_xz.setFocusPolicy(Qt.NoFocus)

        selbtn = QPushButton("选择下载目录", self)
        selbtn.move(460, 55)
        selbtn.clicked.connect(self.showDir)

        self.text = QLineEdit("", self)
        self.text.resize(350, 20)
        self.text.move(100, 28)
        self.text.textChanged.connect(self.changeText)

        self.textedit = QTextEdit("", self)
        self.textedit.resize(510, 200)
        self.textedit.move(100, 140)

        btn = QPushButton("下载", self)
        btn.move(460, 28)
        btn.clicked.connect(self.down)

        self.cancelbtn = QPushButton("重置", self)
        self.cancelbtn.move(540, 28)
        self.cancelbtn.clicked.connect(self.cancel)
        self.cancelbtn.setDisabled(True)

        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(100, 80, 300, 25)

        self.lbl2 = QLabel("", self)
        self.lbl2.move(100, 110)

        self.setGeometry(300, 300, 650, 400)
        self.center()
        self.setWindowTitle("下载文件")

        # 创建线程
        self.workthread = WorkThread()
        self.workthread.trigger.connect(self.progressbar)
        self.workthread.trigger2.connect(self.downresult)

    def showDir(self):
        download_path = QFileDialog.getExistingDirectory(self,"浏览",r"C:/Users/Administrator/Desktop")
        self.text_xz.setText(download_path)

    def cancel(self):
        self.text.setText("")
        self.lbl2.setText("")
        self.pbar.setValue(0)

    def down(self):
        self.cancelbtn.setDisabled(True)
        self.workthread.url = self.text.text()
        if self.workthread.url == "":
            QMessageBox.information(self,"错误信息","URL不能为空")
            return
        self.workthread.start()

    def downresult(self,info):
        self.lbl2.setText(info)
        self.lbl2.adjustSize()

    def progressbar(self, num):
        self.pbar.setValue(num)
        if num == 100:
            info = time.strftime("%y/%M/%d %H:%M:%S", time.localtime()) + ":" + self.text.text() + "\n" + self.textedit.toPlainText()
            self.textedit.setText(info)
            self.cancelbtn.setDisabled(False)

    def changeText(self, text):
        if text == "":
            self.lbl2.setText("")
            self.pbar.setValue(0)




    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    down = DownLoad()
    down.show()
    sys.exit(app.exec_())


很赞哦! (0)
  • 上一篇

    PyQt5 隐藏标题栏

    用Qt写一个窗口,如果继承QDialog,那窗口就只有关闭按钮,如果继承QWidget,那么就有关闭...

  • 下一篇

    PyQt5 浏览目录

    import sys from PyQt5.QtWidgets ...

文章评论

0条评论
我的世界,注定与众不同
  • 阿里云git安装

  • 忘羡一梦 美梦成真

  • 没有唯一

  • 在centos 安装python3

  • php 双向加密解密

  • python 定时器(timer)

标签云

猜你喜欢

PHP网站源码崇左网站推广多少钱玉树营销型网站建设推荐榆林模板制作推荐鞍山SEO按天扣费哪家好淮安企业网站设计报价呼和浩特seo排名价格景德镇网络推广公司本溪网站建设多少钱亳州优化哪家好平凉网站建设设计公司扬州营销网站报价大同网站关键词优化报价厦门网页设计公司南通如何制作网站多少钱内江网站优化排名推荐甘孜网站开发哪家好肇庆网站推广多少钱和田模板制作推荐毕节SEO按天扣费报价阳泉百度爱采购公司恩施外贸网站设计报价朔州SEO按天收费淮南网站优化软件成都SEO按天收费公司辽源网站搜索优化价格绥化网络推广价格金华seo网站优化多少钱本溪seo优化哪家好清徐英文网站建设济宁seo网站优化公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化