PyQt5實(shí)現(xiàn)下載進(jìn)度條效果
起因是因?yàn)楣疽_發(fā)一款自動(dòng)登錄某網(wǎng)站的助手工具提供給客戶使用,要使用到selenium,所以選擇了pyqt5的方式來(lái)開發(fā)這個(gè)C/S架構(gòu)的客戶端
在過(guò)程中要用到自動(dòng)更新的功能,所以自己寫一個(gè)下載進(jìn)度的插件給大家分享,本人編程水平有點(diǎn)菜,不要見怪。
界面文件UI_download.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import Qt
class Ui_download(object):
def setupUi(self, Dialog):
Dialog.setWindowFlags(Qt.FramelessWindowHint)
Dialog.setObjectName("Dialog")
Dialog.resize(300, 56)
Dialog.setFixedSize(Dialog.width(), Dialog.height())
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
Dialog.setSizeGripEnabled(True)
self.gridLayout = QtWidgets.QGridLayout(Dialog)
self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.gridLayout.setObjectName("gridLayout")
self.progressBar = QtWidgets.QProgressBar(Dialog)
self.progressBar.setProperty("value", 0)
self.progressBar.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.progressBar.setObjectName("progressBar")
self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 1)
self.label = QtWidgets.QLabel(Dialog)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "客戶端更新下載中..."))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_download()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
實(shí)現(xiàn)文件download.py
# -*- coding: utf-8 -*-
"""
Module implementing Dialog.
"""
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QDialog
from PyQt5 import QtWidgets
from Ui_download import Ui_download
import os
import sys
import requests
class downloadThread(QThread):
download_proess_signal = pyqtSignal(int)
def __init__(self, download_url, filesize, fileobj, buffer):
super(downloadThread, self).__init__()
self.download_url = download_url
self.filesize = filesize
self.fileobj = fileobj
self.buffer = buffer
def run(self):
try:
f = requests.get(self.download_url, stream=True)
offset = 0
for chunk in f.iter_content(chunk_size=self.buffer):
if not chunk:
break
self.fileobj.seek(offset)
self.fileobj.write(chunk)
offset = offset + len(chunk)
proess = offset / int(self.filesize) * 100
self.download_proess_signal.emit(int(proess))
self.fileobj.close()
self.exit(0)
except Exception as e:
print(e)
class download(QDialog, Ui_download):
"""
下載類實(shí)現(xiàn)
"""
def __init__(self, download_url, auto_close=True, parent=None):
"""
Constructor
@download_url:下載地址
@auto_close:下載完成后時(shí)候是否需要自動(dòng)關(guān)閉
"""
super(download, self).__init__(parent)
self.setupUi(self)
self.progressBar.setValue(0)
self.downloadThread = None
self.download_url = download_url
self.filesize = None
self.fileobj = None
self.auto_close = auto_close
self.download()
def download(self):
self.filesize = requests.get(self.download_url, stream=True).headers['Content-Length']
path = os.path.join("update", os.path.basename(self.download_url))
self.fileobj = open(path, 'wb')
self.downloadThread = downloadThread(self.download_url, self.filesize, self.fileobj, buffer=10240)
self.downloadThread.download_proess_signal.connect(self.change_progressbar_value)
self.downloadThread.start()
def change_progressbar_value(self, value):
self.progressBar.setValue(value)
if self.auto_close and value == 100:
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = download()
ui.show()
sys.exit(app.exec_())
比較通用的一個(gè)下載模塊,初始化調(diào)用的時(shí)候只需要傳入要下載的地址就行,下載操作采取異步,以防阻塞UI,確保程序目錄下?lián)碛衭pdate目錄存在,默認(rèn)我是將要更新的文件放在這個(gè)目錄下面,還有優(yōu)化的地方希望大家可以指出。
運(yùn)行后效果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 讀寫csv文件方式(創(chuàng)建,追加,覆蓋)
這篇文章主要介紹了python 讀寫csv文件方式(創(chuàng)建,追加,覆蓋),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Pytorch實(shí)現(xiàn)LSTM案例總結(jié)學(xué)習(xí)
這篇文章主要介紹了Pytorch實(shí)現(xiàn)LSTM案例總結(jié)學(xué)習(xí),文章通過(guò)構(gòu)建網(wǎng)絡(luò)層、前向傳播forward()展開主題介紹,需要的小伙吧可以參考一下2022-07-07
Python實(shí)現(xiàn)多條件篩選目標(biāo)數(shù)據(jù)功能【測(cè)試可用】
這篇文章主要介紹了Python實(shí)現(xiàn)多條件篩選目標(biāo)數(shù)據(jù)功能,結(jié)合實(shí)例形式總結(jié)分析了Python3使用內(nèi)建函數(shù)filter、pandas包以及for循環(huán)三種方法對(duì)比分析了列表進(jìn)行條件篩選操作相關(guān)實(shí)現(xiàn)技巧與運(yùn)行效率,需要的朋友可以參考下2018-06-06
Python實(shí)現(xiàn)統(tǒng)計(jì)mp4/avi視頻的時(shí)長(zhǎng)
moviepy是一個(gè)用于處理視頻和音頻的Python庫(kù),它提供了一組功能豐富的工具,所以本文將利用它實(shí)現(xiàn)統(tǒng)計(jì)mp4/avi視頻的時(shí)長(zhǎng),希望對(duì)大家有所幫助2023-07-07
Python疫情確診折線圖實(shí)現(xiàn)數(shù)據(jù)可視化實(shí)例詳解
數(shù)據(jù)可視化是指用圖形或表格的方式來(lái)呈現(xiàn)數(shù)據(jù)。圖表能夠清楚地呈現(xiàn)數(shù)據(jù)性質(zhì),?以及數(shù)據(jù)間或?qū)傩蚤g的關(guān)系,可以輕易地讓人看圖釋義。用戶通過(guò)探索圖(Exploratory?Graph)可以了解數(shù)據(jù)的特性、尋找數(shù)據(jù)的趨勢(shì)、降低數(shù)據(jù)的理解門檻2022-09-09
python?Pandas之DataFrame索引及選取數(shù)據(jù)
這篇文章主要介紹了python?Pandas之DataFrame索引及選取數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制
今天小編就為大家分享一篇Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

