我正在使用多线程做一个下载器,问题是调用多线程时老是说没有start()这个方法,代码如下
try:
#---------------------------------------
import logging,time
import os
import datetime
import sys
import subprocess
import requests
import cgitb
cgitb.enable(format='text')
from PyQt5.QtCore import Qt
from PyQt5.QtGui import *
from PyQt5.Qt import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
#---------------------------------------
class BugReport_UI(QMainWindow):
def __init__(self):
super().__init__()
self.user=os.getlogin()
self.is_showDetail=False
self.headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'}
self.ui()
def ui(self):
#Temp
if not os.path.exists('temp'):
os.makedirs('temp')
#Read
error=open('error_easy.txt','r',encoding='utf-8')
errorText=error.read()
error.close()
errorDet=open('Downloader_log.log','r',encoding='utf-8')
errorDetText=errorDet.read()
errorDet.close()
#UI
self.resize(390,220)
self.setWindowIcon(QApplication.style().standardIcon(11))
self.setWindowTitle('高速下载器 - 错误反馈')
self.setFixedSize(self.width(),self.height())
#errorIcon
self.errorIcon=QPushButton(self)
self.errorIcon.setIconSize(QSize(32,32))
self.errorIcon.resize(32,32)
self.errorIcon.move(25,20)
self.errorIcon.setIcon(QApplication.style().standardIcon(11))
self.errorIcon.setStyleSheet('border:0px;')
self.errorIcon.show()
#Reinstall
try:
self.ReinstallBtn=QPushButton(self)
self.ReinstallBtn.setText('重新安装程序')
self.ReinstallBtn.move(10,355)
self.ReinstallBtn.show()
self.ReinstallBtn.clicked.connect(lambda:self.clicked())
except Exception as error:
print(error)
#longText
self.longText=QLabel(self)
self.longText.resize(395,55)
self.longText.setStyleSheet('font-family:Microsoft Yahei;font-size:15px')
self.longText.setText('程序中出现了错误(异常),需要修复,'+'\n'+'给您带来的不便,我们很是抱歉。错误如下:')
self.longText.move(65,20)
self.longText.show()
#errorText1
self.error_=QTextEdit(self)
self.error_.resize(370,100)
self.error_.setLineWrapMode(False)
self.error_.setStyleSheet('font-family:Microsoft Yahei;font-size:15px;color:red;')
self.error_.setText(errorText+'\n'+'如果您发现重启程序没有起作用的话,可以尝试重新安装程序。')
self.error_.move(10,70)
self.error_.setReadOnly(True)
self.error_.show()
#ok
self.ok=QPushButton(self)
self.ok.setText('确定')
self.ok.move(280,180)
self.ok.clicked.connect(lambda:self.exit())
self.ok.show()
#restart
self.restart=QPushButton(self)
self.restart.setText('重启程序')
self.restart.move(150,180)
self.restart.clicked.connect(lambda:self.restart_())
self.restart.show()
#ShowDetails
self.ShowDetails=QPushButton(self)
self.ShowDetails.setText('展示细节>>')
self.ShowDetails.setDefault(True)
self.ShowDetails.move(20,180)
self.ShowDetails.setAutoRepeat(True)
self.ShowDetails.clicked.connect(lambda:self.resizeS_())
self.ShowDetails.show()
#TextEdit
self.errorText=QTextEdit(self)
self.errorText.resize(370,120)
self.errorText.move(10,230)
self.errorText.setPlainText(errorDetText)
self.errorText.setReadOnly(True)
self.errorText.setLineWrapMode(False)
self.errorText.setStyleSheet('font-family:Microsoft Yahei;font-size:13px;color:red;')
self.errorText.show()
def resizeS_(self):
print('1')
if not self.is_showDetail:
self.is_showDetail=True
self.setFixedSize(QSize(390,390))
self.ShowDetails.setText('收起细节<<')
self.update()
else:
self.is_showDetail=False
self.setFixedSize(QSize(390,220))
self.ShowDetails.setText('展示细节>>')
self.update()
def restart_(self):
subprocess.Popen('Downloader.pyw',shell=True)
self.destroy()
def exit(self):
cl=open('error_easy.txt','w',encoding='utf-8')
cl.write('')
cl1=open('Downloader_log.log','w',encoding='utf-8')
cl1.write('')
cl.close()
cl1.close()
self.destroy()
def clicked(self):
self.thread_=RunThread()
self.thread_.start()
main=BugReport_UI
class RunThread(QThread):
signal_=pyqtSignal(str)
def __init__(self):
super(RunThread,self).__init__()
self.info='Thread'
def __del__(self):
self.wait()
def run(self):
try:
main.error_.clear()
try:
self.head=requests.head('https://issuecdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.2.8.9.exe',headers=main.headers)
main.error_.insertPlainText('获取请求头中...'+'\n')
except Exception as error:
print(error)
#----------------------------------------
self.content=self.head.content
self.filesize=int(self.head.headers.get('Content-Length'))
#----------------------------------------
try:
self.response=requests.get('https://issuecdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.2.8.9.exe',headers=main.headers,stream=True)
main.error_.insertPlainText('获取请求中...'+'\n')
except Exception as error:
print(error)
#----------------------------------------
Read=0
ChunkSize=1024*600
with open('C:/Users/{0}/desktop'.format(main.user)+'/'+'高速下载器安装包.exe','wb') as write_file:
for chunk in self.response.iter_content(chunk_size=ChunkSize):
Read+=ChunkSize
Read=min(Read,self.filesize)
write_file.write(chunk)
main.error_.insertPlainText('下载进度:'+str(((Read/self.filesize)*100))+'\n')
main.error_.setPlainText('下载完成。下载到了桌面。'+'\n')
except Exception as error:
print(error)
#---------------------------------------
Application=QApplication(sys.argv)
main=BugReport_UI()
main.show()
sys.exit(Application.exec_())
#---------------------------------------
except Exception as error:
#QMessageBox.critical(None,'提示',str(error),QMessageBox.Yes|QMessageBox.Yes)
print(error)
finally:
for file in os.listdir('temp'):
os.remove('temp/'+file)
print('exit')