wxpython下载缓慢_wxpython-通过request远程下载网络zip文件,并解压安装文件

# -*- coding: UTF-8 -*-

import os

import zipfile

from threading import Thread

import requests

import wx

from wx.lib.pubsub import pub

from view.window import updateOTAFrame

class MyApp(wx.App):

def OnInit(self):

self.frame = updateOTAFrame.MyFrame(None, wx.ID_ANY, "")

self.frame.CenterOnScreen()

self.download_gauge = self.frame.gauge_1

self.start_button = self.frame.button_1

self.frame.timer = wx.Timer(self.frame) # 创建定时器

# 绑定一个定时器事件,wxpython存在bug,不设定定时器,pub功能不会正常启用

self.frame.Bind(wx.EVT_TIMER, self.on_timer, self.frame.timer)

self.frame.Show()

self.start_button.Bind(wx.EVT_BUTTON, self.start_event)

pub.subscribe(self.update_ota, "ota_topic")

pub.subscribe(self.download_text_topic, "download_text_topic")

self.download_text = self.frame.label_1

self.download_text.SetLabelText("点击开始升级按钮,即刻开始升级")

self.start_button.SetLabelText("开始升级")

pub.subscribe(self.close_frame, "close_download_topic")

return True

# 下载完成后,关闭窗口

def close_frame(self, msg):

self.frame.Destroy()

# 开始下载按钮事件

def start_event(self, event):

self.start_button.SetLabelText("正在升级")

self.download_text.SetLabelText("正在下载升级包,请不要关闭程序,目前进度:0%")

self.start_button.Disable()

GuageThread()

event.Skip()

# 控制下载的时候的文字

def download_text_topic(self, msg):

if msg < 100:

self.download_text.SetLabelText("正在下载升级包,请不要关闭程序,目前进度:" + str(msg) + "%")

else:

self.download_text.SetLabelText('下载成功,现在开始解压,请耐心等待大于10秒')

self.start_button.SetLabelText('正在解压')

# 控制下载的进度条

def update_ota(self, msg):

if msg < 100: # 如果是数字,说明线程正在执行,显示数字

self.download_gauge.SetValue(msg)

else:

self.download_gauge.SetValue(msg)

def on_timer(self, evt): # 定时执行检查网络状态

pass

# 另外启动一个线程来控制进度条,不然程序会假死

class GuageThread(Thread):

def __init__(self):

# 线程实例化时立即启动

Thread.__init__(self)

self.start()

def run(self):

# 线程执行的代码

self.download_file()

def download_file(self):

# url = "http://example.cn/test.zip" 是网络上的zip压缩包文件

url = "http://example.cn/test.zip"

# 通过Session来下载,速度比直接requests.get快了大约百分之30

response = requests.Session().get(url, verify=False, stream=True)

total_length = int(response.headers.get("Content-Length"))

with open(os.path.abspath(os.getcwd() + "/resource/download/new.zip"), "wb") as code:

i = 0

temp = 0

# 用chunk_size的方法来下载,可以知道当前的下载进度。chunk_size影响每次写入的内存大小

for chunk in response.iter_content(chunk_size=512):

if chunk:

code.write(chunk)

code.flush()

i = i + 512

number = int(i)

# 因为进度条的长度设置成了100,所以这里要乘以100

message = number * 100 / total_length

wx.CallAfter(pub.sendMessage, "ota_topic", msg=message)

if temp != message:

temp = message

wx.CallAfter(pub.sendMessage, "download_text_topic", msg=message)

filepath = os.path.abspath(os.getcwd() + "/resource/download/new.zip")

# 直接放在程序根目录下了

foldpath = os.path.abspath(os.getcwd())

self.unzip(filepath, foldpath)

wx.CallAfter(pub.sendMessage, "close_download_topic", msg=1)

# 解压文件用的zipfile,将解压的文件,放置到指定路径下(覆盖复制)

def unzip(self, zip_file_path, unzip_to_path):

unzip_flag = False

try:

check_zip_flag = zipfile.is_zipfile(zip_file_path)

if check_zip_flag:

azip = zipfile.ZipFile(zip_file_path)

azip.extractall(path=unzip_to_path)

unzip_flag = True

except Exception as e:

print e.message

finally:

print "unzip_flag==========", unzip_flag

return unzip_flag

# end of class MyApp

if __name__ == "__main__":

app = MyApp(0)

app.MainLoop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值