Example #1
0
 def source_thread(self):
     try:
         self.source_Thread = Source_Thread()
         self.source_Thread.thread_signal.connect(self.Source_UI)
         self.source_Thread.start()
     except Exception as e:
         print(f"Source Thread: {e}")
         QMessageBox.information(self, '源码仓库发生错误', f'错误信息{e},请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')
Example #2
0
class fun_main(Ui_MainWindow, QtWidgets.QMainWindow):
    def __init__(self):
        super(fun_main, self).__init__()
        self.setupUi(self)
        self.setWindowOpacity(1)  # 设置窗口透明度
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)  # 主窗口透明
        self.setWindowFlag(QtCore.Qt.FramelessWindowHint)  # 隐藏边框

        # 初始化功能
        self.signal_on_btn()
        self.icon_on_btn()

        # 初始化参数
        self.m_flag = False
        self.source_url = []  # 源码仓库链接初始化
        self.article_url = []  # 文章教程链接初始化
        self.label_10.hide()
        self.label_sys_info.hide()
        self.label_welcome.setText(soft_cfg.welcome)

        # 线程启动
        self.time_thread()
        self.source_thread()
        self.article_thread()
        self.webDownloader_Thread = Downloader_Thread()
        self.webDownloader_Thread.start()
        self.update_thread()

    def signal_on_btn(self):
        # 基础按钮事件绑定
        self.pushButton_close.clicked.connect(lambda: self.window_close(0))
        self.pushButton_min.clicked.connect(lambda: self.showMinimized())
        self.pushButton_feedback.clicked.connect(
            lambda: open_browser(soft_cfg.feed_back))
        self.pushButton_web_site.clicked.connect(
            lambda: open_browser(soft_cfg.web_site))
        self.pushButton_help_us.clicked.connect(
            lambda: open_browser(soft_cfg.help_us))
        self.pushButton_web_rights.clicked.connect(self.licenses)
        self.pushButton_update.clicked.connect(self.update_thread)

        # List Widget点击事件
        self.listWidget_source.itemClicked.connect(self.source_item_clicked)
        self.listWidget_article.itemClicked.connect(self.article_item_clicked)

        # 界面转换
        self.pushButton_menu_soft.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))
        # self.pushButton_menu_api.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(1))
        self.pushButton_menu_api.clicked.connect(
            lambda: open_browser(soft_cfg.api_site))
        self.pushButton_menu_article.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(2))
        self.pushButton_menu_source.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(3))
        self.pushButton_menu_about_us.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(4))
        # self.pushButton_menu_downloader.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(7))
        self.pushButton_menu_downloader.clicked.connect(
            lambda: open_browser(soft_cfg.download_url))

    def icon_on_btn(self):
        self.pushButton_feedback.setIcon(
            qtawesome.icon('fa.envelope-o', color="blank"))
        self.pushButton_min.setIcon(
            qtawesome.icon('fa.window-minimize', color='blank'))
        self.pushButton_close.setIcon(qtawesome.icon('fa.close',
                                                     color='blank'))
        self.pushButton_update.setIcon(
            qtawesome.icon('fa.arrow-circle-up', color='blank'))
        # 菜单栏图标
        self.pushButton_menu_about_us.setIcon(
            qtawesome.icon('fa.yelp', color='white'))
        self.pushButton_menu_api.setIcon(
            qtawesome.icon('fa.link', color='white'))
        self.pushButton_menu_article.setIcon(
            qtawesome.icon('fa.file-text', color='white'))
        self.pushButton_menu_source.setIcon(
            qtawesome.icon('fa.code', color='white'))
        self.pushButton_menu_soft.setIcon(
            qtawesome.icon('fa.th-large', color='white'))
        self.pushButton_menu_downloader.setIcon(
            qtawesome.icon('fa.download', color='white'))

    # 自定义功能区
    def window_close(self, code):
        res = QMessageBox.question(self, '是否关闭程序', '请确保没有下载任务',
                                   QMessageBox.Yes | QMessageBox.No,
                                   QMessageBox.No)
        if res == QMessageBox.Yes:
            self.webDownloader_Thread.stop()
            qApp.exit(code)
        else:
            pass

    def licenses(self):
        self.stackedWidget.setCurrentIndex(1)
        self.textEdit_licenses.append(soft_cfg.licenses)
        scrollbar = self.textEdit_licenses.verticalScrollBar()
        scrollbar.setSliderPosition(0)

    # 界面拖动
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_flag = True
            self.m_Position = event.globalPos() - self.pos()  # 获取鼠标相对窗口的位置
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))  # 更改鼠标图标

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_flag:
            self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置
            QMouseEvent.accept()

    def mouseReleaseEvent(self, QMouseEvent):
        self.m_flag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    # 线程区
    def time_thread(self):
        try:
            self.time_Thread = Time_Thread()
            self.time_Thread.thread_signal.connect(self.Time_UI)
            self.time_Thread.start()
        except Exception as e:
            print(f"Time Thread: {e}")
            QMessageBox.information(self, '时间进程发生错误',
                                    f'错误信息{e},请尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Time_UI(self, msm):
        self.label_time.setText(f"{msm}")

    def source_thread(self):
        try:
            self.source_Thread = Source_Thread()
            self.source_Thread.thread_signal.connect(self.Source_UI)
            self.source_Thread.start()
        except Exception as e:
            print(f"Source Thread: {e}")
            QMessageBox.information(
                self, '源码仓库发生错误',
                f'错误信息{e},请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Source_UI(self, msm):
        self.source_url = msm['url']
        try:
            self.listWidget_source.clear()
        except Exception as e:
            print(f"source function.py: {e}")
        for i in zip(msm['title'], msm['info'], msm['language'], msm['url']):
            item = QListWidgetItem()
            widget = get_item_source(i)
            item.setSizeHint(QSize(widget.width(), widget.height()))
            self.listWidget_source.addItem(item)
            self.listWidget_source.setItemWidget(item, widget)

    def source_item_clicked(self, item):
        open_browser(
            self.source_url[self.listWidget_source.currentIndex().row()])

    def article_thread(self):
        try:
            self.article_Thread = Article_Thread()
            self.article_Thread.thread_signal.connect(self.Article_UI)
            self.article_Thread.start()
        except Exception as e:
            print(f"Article Thread: {e}")
            QMessageBox.information(
                self, '文章教程发生错误',
                f'错误信息{e},请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Article_UI(self, msm):
        self.article_url = msm['url']
        try:
            self.listWidget_article.clear()
        except Exception as e:
            print(f"article function.py: {e}")
        for i in zip(msm['title'], msm['info'], msm['date'], msm['url']):
            item = QListWidgetItem()
            widget = get_item_source(i)
            item.setSizeHint(QSize(widget.width(), widget.height()))
            self.listWidget_article.addItem(item)
            self.listWidget_article.setItemWidget(item, widget)

    def article_item_clicked(self, item):
        open_browser(
            self.article_url[self.listWidget_article.currentIndex().row()])

    def update_thread(self, auto=True):
        try:
            self.update_Thread = Update_Thread(auto)
            self.update_Thread.display_signal.connect(self.Update_UI)
            self.update_Thread.start()
        except:
            QMessageBox.information(
                self, '小助手提示',
                '程序运行异常,请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Update_UI(self, msm):
        if msm['Version'] <= soft_cfg.version:
            if not msm["auto"] != False:
                QMessageBox.information(self, '小助手提示', '已经是最新版本')
            else:
                pass
        else:
            reply = QtWidgets.QMessageBox.question(
                self, '发现新版本,是否立即更新',
                f'发现新版本:V{msm["Version"]},更新内容如下:\n\n{msm["Update_des"]}\n\n是否立即更新?',
                QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                QtWidgets.QMessageBox.No)
            if reply == QtWidgets.QMessageBox.Yes:
                subprocess.Popen(
                    f"update_main.exe {msm['Update_url']} {soft_cfg.name}")
                qApp.exit(0)
            else:
                pass
Example #3
0
class fun_main(Ui_MainWindow, QtWidgets.QMainWindow):
    def __init__(self):
        super(fun_main, self).__init__()
        self.setupUi(self)
        self.setWindowOpacity(1)  # 设置窗口透明度
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)  # 主窗口透明
        self.setWindowFlag(QtCore.Qt.FramelessWindowHint)  # 隐藏边框
        # self.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint)  # 窗口始终置顶

        # 初始化功能
        self.signal_on_btn()
        self.icon_on_btn()

        # 初始化参数
        self.m_flag = False
        self.source_url = []  # 源码仓库链接初始化
        self.article_url = []  # 文章教程链接初始化
        self.label_10.hide()
        self.label_sys_info.hide()
        self.pros = [
            self.progressBar_downloader_sub0, self.progressBar_downloader_sub1,
            self.progressBar_downloader_sub2, self.progressBar_downloader_sub3,
            self.progressBar_downloader_sub4, self.progressBar_downloader_sub5,
            self.progressBar_downloader_sub6, self.progressBar_downloader_sub7,
            self.progressBar_downloader_sub8, self.progressBar_downloader_sub9,
            self.progressBar_downloader_sub10,
            self.progressBar_downloader_sub11,
            self.progressBar_downloader_sub12,
            self.progressBar_downloader_sub13,
            self.progressBar_downloader_sub14,
            self.progressBar_downloader_sub15
        ]
        for i in self.pros:
            i.hide()
        self.progressBar_downloader_main.hide()
        self.textEdit_download_sub.hide()
        msm = f"<center><h2>欢迎试用此下载器</h2>" \
              f"<h4>本软件为开源项目,可点击左侧'源码仓库'菜单,点击'System-assistant'查看程序源码</h4>" \
              f"<h4>当前版本仅支持http/https下载协议的下载链接,其他协议链接正在添加中</h4>" \
              f"<h3>程序功能正在逐步完善中,敬请期待...</h3></center>"
        self.textEdit_download_top.append(msm)

        # 线程启动
        self.time_thread()
        self.source_thread()
        self.article_thread()
        self.update_thread()

    def signal_on_btn(self):
        # 基础按钮事件绑定
        self.pushButton_close.clicked.connect(lambda: self.window_close(0))
        self.pushButton_min.clicked.connect(lambda: self.showMinimized())
        self.pushButton_feedback.clicked.connect(
            lambda: open_browser(soft_cfg.feed_back))
        self.pushButton_web_site.clicked.connect(
            lambda: open_browser(soft_cfg.web_site))
        self.pushButton_help_us.clicked.connect(
            lambda: open_browser(soft_cfg.help_us))
        self.pushButton_web_rights.clicked.connect(self.licenses)
        self.pushButton_update.clicked.connect(self.update_thread)
        self.pushButton_downloader_new.clicked.connect(self.open_download_win)

        # List Widget点击事件
        self.listWidget_source.itemClicked.connect(self.source_item_clicked)
        self.listWidget_article.itemClicked.connect(self.article_item_clicked)

        # 界面转换
        self.pushButton_menu_soft.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))
        # self.pushButton_menu_api.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(1))
        self.pushButton_menu_api.clicked.connect(self.open_api_site)
        self.pushButton_menu_article.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(2))
        self.pushButton_menu_source.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(3))
        self.pushButton_menu_about_us.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(4))
        self.pushButton_menu_downloader.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(7))

    def icon_on_btn(self):
        self.pushButton_feedback.setIcon(
            qtawesome.icon('fa.envelope-o', color="blank"))
        self.pushButton_min.setIcon(
            qtawesome.icon('fa.window-minimize', color='blank'))
        self.pushButton_close.setIcon(qtawesome.icon('fa.close',
                                                     color='blank'))
        self.pushButton_update.setIcon(
            qtawesome.icon('fa.arrow-circle-up', color='blank'))
        # 菜单栏图标
        self.pushButton_menu_about_us.setIcon(
            qtawesome.icon('fa.yelp', color='white'))
        self.pushButton_menu_api.setIcon(
            qtawesome.icon('fa.link', color='white'))
        self.pushButton_menu_article.setIcon(
            qtawesome.icon('fa.file-text', color='white'))
        self.pushButton_menu_source.setIcon(
            qtawesome.icon('fa.code', color='white'))
        self.pushButton_menu_soft.setIcon(
            qtawesome.icon('fa.th-large', color='white'))
        self.pushButton_menu_downloader.setIcon(
            qtawesome.icon('fa.download', color='white'))
        # 下载器
        self.pushButton_downloader_new.setIcon(
            qtawesome.icon('fa.plus', color='blue'))

    # 自定义功能区
    def window_close(self, code):
        res = QMessageBox.question(self, '是否关闭程序', '请确保没有下载任务',
                                   QMessageBox.Yes | QMessageBox.No,
                                   QMessageBox.No)
        if res == QMessageBox.Yes:
            qApp.exit(code)
        else:
            pass

    def open_api_site(self):  # 接口文档 --跳转到API网页
        res = QMessageBox.question(self, '提示',
                                   '即将在浏览器中打开接口文档,需登录后才可使用本站API,是否继续?',
                                   QMessageBox.Yes | QMessageBox.No,
                                   QMessageBox.No)
        if res == QMessageBox.Yes:
            open_browser(soft_cfg.api_site)
        else:
            pass

    def licenses(self):
        self.stackedWidget.setCurrentIndex(1)
        self.textEdit_licenses.append(soft_cfg.licenses)
        scrollbar = self.textEdit_licenses.verticalScrollBar()
        scrollbar.setSliderPosition(0)

        # 界面拖动

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_flag = True
            self.m_Position = event.globalPos() - self.pos()  # 获取鼠标相对窗口的位置
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))  # 更改鼠标图标

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_flag:
            self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置
            QMouseEvent.accept()

    def mouseReleaseEvent(self, QMouseEvent):
        self.m_flag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    # 线程区
    def time_thread(self):
        try:
            self.time_Thread = Time_Thread()
            self.time_Thread.thread_signal.connect(self.Time_UI)
            self.time_Thread.start()
        except Exception as e:
            print(f"Time Thread: {e}")
            QMessageBox.information(self, '时间进程发生错误',
                                    f'错误信息{e},请尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Time_UI(self, msm):
        self.label_time.setText(f"{msm}")

    def source_thread(self):
        try:
            self.source_Thread = Source_Thread()
            self.source_Thread.thread_signal.connect(self.Source_UI)
            self.source_Thread.start()
        except Exception as e:
            print(f"Source Thread: {e}")
            QMessageBox.information(
                self, '源码仓库发生错误',
                f'错误信息{e},请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Source_UI(self, msm):
        self.source_url = msm['url']
        try:
            self.listWidget_source.clear()
        except Exception as e:
            print(f"source function.py: {e}")
        for i in zip(msm['title'], msm['info'], msm['language'], msm['url']):
            item = QListWidgetItem()
            widget = get_item_source(i)
            item.setSizeHint(QSize(widget.width(), widget.height()))
            self.listWidget_source.addItem(item)
            self.listWidget_source.setItemWidget(item, widget)

    def source_item_clicked(self, item):
        open_browser(
            self.source_url[self.listWidget_source.currentIndex().row()])

    def article_thread(self):
        try:
            self.article_Thread = Article_Thread()
            self.article_Thread.thread_signal.connect(self.Article_UI)
            self.article_Thread.start()
        except Exception as e:
            print(f"Article Thread: {e}")
            QMessageBox.information(
                self, '文章教程发生错误',
                f'错误信息{e},请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Article_UI(self, msm):
        self.article_url = msm['url']
        try:
            self.listWidget_article.clear()
        except Exception as e:
            print(f"article function.py: {e}")
        for i in zip(msm['title'], msm['info'], msm['date'], msm['url']):
            item = QListWidgetItem()
            widget = get_item_source(i)
            item.setSizeHint(QSize(widget.width(), widget.height()))
            self.listWidget_article.addItem(item)
            self.listWidget_article.setItemWidget(item, widget)

    def article_item_clicked(self, item):
        open_browser(
            self.article_url[self.listWidget_article.currentIndex().row()])

    def open_download_win(self):
        downloadWin = Download_UI()
        downloadWin.mySignal.connect(self.download_thread)
        downloadWin.exec_()

    def download_thread(self, msm):
        url = msm[0]
        thread = msm[1]
        fileName = msm[2]
        self.progressBar_downloader_main.show()
        self.textEdit_download_top.clear()
        self.textEdit_download_sub.clear()
        self.textEdit_download_sub.show()
        try:
            self.download_Thread.stop()
            self.download_Thread.thread_signal.disconnect()
        except:
            pass
        self.download_Thread = Download_Thread(url, thread, fileName)
        self.download_Thread.thread_signal.connect(self.downloadThread)
        self.download_Thread.start()
        self.progressBar_downloader_main.setValue(0)
        for i in self.pros:
            i.setValue(0)
        for i in range(thread):
            self.pros[i].show()

    def downloadThread(self, msm):
        self.textEdit_download_top.clear()
        self.textEdit_download_sub.clear()
        isExists = msm.get('fileExists', 0)
        if isExists == 1:
            QMessageBox.information(
                self, '文件已经存在',
                f'检测到您要下载的文件已经存在,如果想要重新下载请删除 {msm["filePath"]} 后再进行下载')
            self.textEdit_download_top.append(
                f'<center><h2>检测到您要下载的文件已经存在</h2><p>如果想要重新下载请删除 {msm["filePath"]} 后再进行下载</p></center>'
            )
            self.textEdit_download_sub.hide()
            self.progressBar_downloader_main.hide()
            for i in self.pros:
                i.hide()
        else:
            isStarted = msm['info']['started']
            isMutiThread = msm['info']['downloader']
            isFinished = msm['info']['averageSpeed']
            if isStarted == 0:
                self.textEdit_download_top.append(
                    f"下载程序正在初始化,这个过程不会很长\n请稍等...")
            else:
                if isMutiThread == 1 and isFinished == 0:
                    ospeed = msm['main']['speed'] / 1024
                    if ospeed == 0:
                        ospeed = 1
                    if ospeed > 1024:
                        speed = f"{round(ospeed / 1024, 2)} M/s"
                    else:
                        speed = f"{ospeed} KB/s"
                    underTime = (msm['info']['size'] -
                                 msm['main']['data']) / 1024 / ospeed
                    if underTime > 60:
                        underTime = f"{int(underTime / 60)} 分钟 {int(underTime % 60)} 秒"
                    else:
                        underTime = f"{int(underTime)} 秒"
                    self.textEdit_download_top.append(
                        f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['info']['size'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n传输速度:{speed}\n剩余时间:{underTime}\n储存至:{msm['info']['saveTo']}\n"
                    )
                    # 子进度条设置进度
                    for i in range(msm['info']['thread']):
                        self.pros[i].setValue(
                            int(msm['sub']['data'][i][0] /
                                msm['sub']['data'][i][1] * 100))
                    # 主进度条设置进度
                    self.progressBar_downloader_main.setValue(
                        int(msm['main']['data'] / msm['info']['size'] * 100))
                    # 子线程数据显示
                    self.textEdit_download_sub.clear()
                    for i in range(msm['info']['thread']):
                        savedSubData = msm['sub']['data'][i][0] / 1024
                        if savedSubData > 1024:
                            savedSubData = f"{round(savedSubData / 1024, 2)} MB"
                        else:
                            savedSubData = f"{savedSubData} KB"
                        if int(msm['sub']['data'][i][0] / 1024) >= int(
                                msm['sub']['data'][i][1] / 1024):
                            self.textEdit_download_sub.append(
                                f"线程{i + 1}:已接收 {savedSubData},接收完成.")
                        else:
                            self.textEdit_download_sub.append(
                                f"线程{i + 1}:已接收 {savedSubData},正在接收...")
                    scrollbar = self.textEdit_download_sub.verticalScrollBar()
                    scrollbar.setSliderPosition(0)
                elif isMutiThread == 1 and isFinished != 0:
                    # 下载完成,隐藏子进度条
                    for i in range(msm['info']['thread']):
                        self.pros[i].hide()
                    # 子线程数据显示
                    self.textEdit_download_sub.clear()
                    for i in range(msm['info']['thread']):
                        savedSubData = msm['sub']['data'][i][0] / 1024
                        if savedSubData > 1024:
                            savedSubData = f"{round(savedSubData / 1024, 2)} MB"
                        else:
                            savedSubData = f"{savedSubData} KB"
                        self.textEdit_download_sub.append(
                            f"线程{i + 1}:已接收 {savedSubData},接收完成.")
                    self.textEdit_download_sub.append(
                        f"文件下载完成,已经保存到了 {msm['info']['saveTo']} ")
                    scrollbar = self.textEdit_download_sub.verticalScrollBar()
                    scrollbar.setSliderPosition(0)
                    speed = isFinished / 1024
                    if speed > 1024:
                        speed = f"{round(speed / 1024, 2)} M/s"
                    else:
                        speed = f"{speed} KB/s"
                    self.textEdit_download_top.append(
                        f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['info']['size'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n平均速度:{speed}\n已经储存至:{msm['info']['saveTo']}\n"
                    )
                    self.progressBar_downloader_main.setValue(100)
                elif isMutiThread == 0 and isFinished == 0:
                    ospeed = msm['main']['speed'] / 1024
                    if ospeed == 0:
                        ospeed = 1
                    if ospeed > 1024:
                        speed = f"{round(ospeed / 1024, 2)} M/s"
                    else:
                        speed = f"{ospeed} KB/s"
                    self.textEdit_download_top.append(
                        f"文件来源:{msm['info']['url']}\n文件大小:未知\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n传输速度:{speed}\n剩余时间:未知\n储存至:{msm['info']['saveTo']}\n"
                    )
                    # 子进度条设置进度
                    for i in range(msm['info']['thread']):
                        self.pros[i].hide()
                    # 主进度条设置进度
                    self.progressBar_downloader_main.setValue(100)
                else:
                    # 下载完成,隐藏子进度条
                    for i in range(msm['info']['thread']):
                        self.pros[i].hide()
                    speed = isFinished / 1024
                    if speed > 1024:
                        speed = f"{round(speed / 1024, 2)} M/s"
                    else:
                        speed = f"{speed} KB/s"
                    self.textEdit_download_top.append(
                        f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n平均速度:{speed}\n已经储存至:{msm['info']['saveTo']}\n"
                    )

    def update_thread(self, auto=True):
        try:
            self.update_Thread = Update_Thread(auto)
            self.update_Thread.display_signal.connect(self.Update_UI)
            self.update_Thread.start()
        except:
            QMessageBox.information(
                self, '小助手提示',
                '程序运行异常,请确定网络连接是否正常,然后尝试重启客户端,如问题还未解决,请点击反馈按钮留言')

    def Update_UI(self, msm):
        if msm['Version'] <= soft_cfg.version:
            if not msm["auto"] != False:
                QMessageBox.information(self, '小助手提示', '已经是最新版本')
            else:
                pass
        else:
            reply = QtWidgets.QMessageBox.question(
                self, '发现新版本,是否立即更新',
                f'发现新版本:V{msm["Version"]},更新内容如下:\n\n{msm["Update_des"]}\n\n是否立即更新?',
                QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                QtWidgets.QMessageBox.No)
            if reply == QtWidgets.QMessageBox.Yes:
                subprocess.Popen(
                    f"update_main.exe {msm['Update_url']} {soft_cfg.name}")
                qApp.exit(0)
            else:
                pass