如何在这段代码上应用 PyQt QThread

2024-01-13

# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.uic import loadUiType
import youtube_dl
import pafy
import urllib.request
import urllib.parse
from urllib.parse import *
import win32clipboard
import sys
import os
import humanize
import subprocess
import time
import shutil
import re
from pySmartDL import SmartDL
from os.path import splitext, basename
from os import path


Close = False
ShutDown = False
Sleep = False
Restart = False
Paused = False
Stopped = False
Start = True
Resume = True

if getattr(sys, 'frozen', False):
    # frozen
    dir_ = os.path.dirname(sys.executable)
else:
    # unfrozen
    dir_ = os.path.dirname(os.path.realpath(__file__))
FORM_CLASS, _ = loadUiType(path.join(dir_, "main.ui"))


class MainApp(QMainWindow, FORM_CLASS):

    def __init__(self, parent=None):
        super(MainApp, self).__init__(parent)
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.lineEdit.installEventFilter(self)
        self.lineEdit_3.installEventFilter(self)
        self.lineEdit_6.installEventFilter(self)
        self.Handle_Ui()
        self.Handle_Buttons()



    def closeEvent(self, evnt):
        if self._want_to_close:
            super(MainApp, self).closeEvent(evnt)
            sys.exit()

    def Handle_Ui(self):
        #self.lineEdit.setFocus()
        self.setFixedSize(861,441)


    def Handle_Buttons(self):
        self.pushButton_3.clicked.connect(self.open_file_loction)
        self.pushButton_2.clicked.connect(self.Start)
        self.pushButton_13.clicked.connect(self.Pause)
        self.pushButton_14.clicked.connect(self.Stop)
        self.pushButton.clicked.connect(self.Handle_Browse)
        self.pushButton_4.clicked.connect(self.Download_youtube_video)
        self.pushButton_10.clicked.connect(self.get_quality)
        self.pushButton_5.clicked.connect(self.Browse2)
        self.pushButton_6.clicked.connect(self.open_file_location2)
        self.pushButton_11.clicked.connect(self.Search_Qualities)
        self.pushButton_7.clicked.connect(self.Browse3)
        self.pushButton_9.clicked.connect(self.download_playlist)
        self.pushButton_8.clicked.connect(self.open_file_location3)
        self.pushButton_12.clicked.connect(self.open_video)
        self.comboBox_2.currentIndexChanged.connect(self.Action_Happened)
        self.comboBox_3.currentIndexChanged.connect(self.Action_Happened)
        self.comboBox_4.currentIndexChanged.connect(self.Action_Happened)

    def Start(self):
        global Start
        global Stopped
        global Paused
        Start = True
        Stopped = False
        Paused = False
        self.Download()

    def Pause(self):
        global Paused
        global Start
        global Resume
        if self.pushButton_13.text()=="Pause Downloading":
            Paused = True
            Start = False
            Stopped = False
            Resume = False
            self.pushButton_13.setText("Resume Downloading")
            QApplication.processEvents()
        elif self.pushButton_13.text()=="Resume Downloading":
            Start = True
            Paused = False
            Resume = True
            Stopped = False
            self.pushButton_13.setText("Pause Downloading")
            QApplication.processEvents()



    def Stop(self):
        global Stopped
        global Start
        Stopped = True
        Start = False
        Paused = False
        self.Download()


    def Download(self):
        directory = os.path.expanduser("~") + "\AppData\Local\Temp\pySmartDL"
        if not os.path.exists(directory):
            os.makedirs(directory)
        try:
            global Paused
            global Stopped
            global Start
            global XX
            url = self.lineEdit.text()
            save_location = self.lineEdit_2.text()
            obj = SmartDL(url, progress_bar=False)
            if Start == True:
                try:
                    obj.start(blocking=False)
                    while True:
                        self.progressBar.setValue(obj.get_progress()*100)
                        self.label_8.setText("Downloaded: " + str(obj.get_dl_size(human=True)))
                        self.label_38.setText("Speed: " + str(obj.get_speed(human=True)))
                        self.label_39.setText("Remaining Time: " + str(obj.get_eta(human=True)))
                        time.sleep(0.2)
                        QApplication.processEvents()
                        if Paused == True:
                            obj.pause()
                            QApplication.processEvents()
                        if Resume == True:
                                obj.unpause()
                                QApplication.processEvents()
                        if obj.isFinished():
                            break
                        if Stopped == True:
                            obj.stop()
                            self.progressBar.setValue(0)
                            break

                    if obj.isSuccessful():
                        #os.rename(obj.get_dest(), save_location)
                        shutil.move(obj.get_dest(), save_location)

                    if Close == True:
                        QApplication.quit()
                    elif ShutDown == True:
                        os.system('shutdown -s')
                    elif Sleep == True:
                        os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0")
                    elif Restart == True:
                        subprocess.call(["shutdown", "/r"])
                    if Stopped == False:
                        QMessageBox.information(self, "Download Completed", "Your Download is Completed")
                except:
                    QMessageBox.warning(self, "Download Error", "Download Failed")
                    pass
        except Exception as e:
            pass



def main():
    app = QApplication(sys.argv)
    window = MainApp()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main()

我一直在寻找有关如何在上面的代码上应用 Qthread 来动态更新进度栏而不出现“无响应问题”的帮助

我已经阅读了很多主题,并且可以理解 Qthread 的主要概念,但考虑到下载功能与不无限运行的下载按钮连接,仍然不知道如何将其应用到我的代码中。

我应该创建一个子 Qthread 类还是我能做什么?

如果您可以帮我举一个关于如何将它与上面的代码一起使用的示例,我会将其应用到我的 Gui 应用程序的其余代码上。

提前致谢。


当实现 QThread 时,要执行的任务应该在 run() 方法中完成,如果你想用线程提供的数据更新 GUI,则不应直接完成,而应该通过信号来完成,因为 GUI 只能在 main 中更新由此调用的线程为 GUI 线程。

class DownloadThread(QThread):
    dataChanged = pyqtSignal(int, str, str, str)
    Started, Paused, Resume, Stopped = range(4)
    downloadError = pyqtSignal()
    downloadFinished = pyqtSignal()

    def __init__(self, parent=None):
        QThread.__init__(self, parent)
        self.state = DownloadThread.Stopped
        self.params = {"url": "", "save_location": ""}

    def setParams(self, params):
        self.params = params

    def setState(self, state):
        self.state = state

    def run(self):
        obj = SmartDL(self.params["url"], progress_bar=False)
        try:
            obj.start(blocking=False)
            while True:
                self.dataChanged.emit(obj.get_progress() * 100,
                                      str(obj.get_dl_size(human=True)),
                                      str(obj.get_speed(human=True)),
                                      str(obj.get_eta(human=True)))
                time.sleep(0.2)
                if self.state == DownloadThread.Paused:
                    obj.pause()
                if self.state == DownloadThread.Resume:
                    obj.unpause()
                    self.state = DownloadThread.Started
                if obj.isFinished():
                    break
                if self.state == DownloadThread.Stopped:
                    obj.stop()
                    self.progressBar.setValue(0)
                    break
            if obj.isSuccessful():
                # os.rename(obj.get_dest(), save_location)
                shutil.move(obj.get_dest(), self.params["save_location"])
                if self.state == DownloadThread.Started:
                    self.downloadFinished.emit()
        except:
            self.downloadError.emit()

您应该避免使用全局变量,此外您还可以减少仅由一个变量一次更新的多个变量,因此我必须修改 GUI 代码。

class MainApp(QMainWindow, FORM_CLASS):
    def __init__(self, parent=None):
        # ...
        self.Handle_Buttons()
        self.download = DownloadThread(self)
        self.download.dataChanged.connect(self.onDataChanged)
        self.download.downloadError.connect(self.errorDownload)
        self.download.downloadFinished.connect(self.successfulDownload)

    def closeEvent(self, evnt):
        # ...

    def Handle_Ui(self):
        # self.lineEdit.setFocus()
        self.setFixedSize(861, 441)

    def Handle_Buttons(self):
        # ...

    def onDataChanged(self, progress, downloaded, speed, remain):
        self.progressBar.setValue(progress)
        self.label_8.setText("Downloaded: " + downloaded)
        self.label_38.setText("Speed: " + speed)
        self.label_39.setText("Remaining Time: " + remain)

    def Start(self):
        directory = os.path.expanduser("~") + "\AppData\Local\Temp\pySmartDL"
        if not os.path.exists(directory):
            os.makedirs(directory)
        params = {"url": self.lineEdit.text(),
                  "save_location": self.lineEdit_2.text()}
        self.download.setParams(params)
        self.download.setState(DownloadThread.Started)
        self.download.start()

    def Pause(self):
        if self.pushButton_13.text() == "Pause Downloading":
            self.download.setState(DownloadThread.Paused)
            self.pushButton_13.setText("Resume Downloading")
        elif self.pushButton_13.text() == "Resume Downloading":
            self.download.setState(DownloadThread.Resume)
            self.pushButton_13.setText("Pause Downloading")

    def Stop(self):
        self.download.setState(DownloadThread.Stopped)
        self.progressBar.setValue(0)

    def errorDownload(self):
        QMessageBox.warning(self, "Download Error", "Download Failed")

    def successfulDownload(self):
        QMessageBox.information(self, "Download Completed", "Your Download is Completed")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在这段代码上应用 PyQt QThread 的相关文章

  • 没有任何元数据的 zip 文件

    我想找到一种简单的方法来压缩一堆文件 而无需任何文件元数据 例如时间戳 这zip命令似乎总是保留元数据 我没有找到禁用元数据的方法 我希望解决方案是一个命令或最多一个 python 脚本 谢谢 正如一些帖子已经指出的那样 zip 标头中的大
  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 行未从树视图复制

    该行未在树视图中复制 我在按行并复制并粘贴到未粘贴的任何地方后制作了弹出复制 The code popup tk Menu tree opportunity tearoff 0 def row copy item tree opportun
  • 为什么 .setGeometry() 不改变 QWidget 实例的大小?

    我想使用 QWidget 更改 QPushButton 的大小 setGeometry https doc qt io qtforpython 5 PySide2 QtWidgets QWidget html PySide2 QtWidge
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • Paramiko - 使用私钥连接 - 不是有效的 OPENSSH 私钥/公钥文件

    我正在尝试找到解决方案 但无法理解我做错了什么 在我的 Linux 服务器上 我运行了以下命令 ssh keygen t rsa 这产生了一个id rsa and id rsa pub file 然后我将它们复制到本地并尝试运行以下代码 s
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 具有多个元素的数组的真值是二义性错误吗? Python

    from numpy import from pylab import from math import def TentMap a x if x gt 0 and x lt 0 5 return 2 a x elif x gt 0 5 a
  • 如何列出 python PDB 中的当前行?

    在 perl 调试器中 如果重复列出离开当前行的代码段 可以通过输入命令返回到当前行 点 我无法使用 python PDB 模块找到任何类似的东西 如果我list如果我自己离开当前行并想再次查看它 似乎我必须记住当前正在执行的行号 对我来说
  • 将输入发送到 python 子进程而不等待结果

    我正在尝试为一段代码编写一些基本测试 该代码通常通过 stdin 无休止地接受输入 直到给出特定的退出命令 我想检查程序是否在给出一些输入字符串时崩溃 经过一段时间来考虑处理 但似乎无法弄清楚如何发送数据而不是陷入等待我不知道的输出关心 我
  • Pandas Dataframe:将包含列表的行扩展到多行,并为所有列提供所需的索引

    我在 pandas 数据框中有时间序列数据 索引为测量开始时的时间 列中包含以固定采样率记录的值列表 连续索引 列表中元素数量的差异 这是它的样子 Time A B Z 0 1 2 3 4 1 2 3 4 2 5 6 7 8 5 6 7 8
  • 将一个列表的元素除以另一个列表的元素

    我有两个清单 比如说 a 10 20 30 40 50 60 b 30 70 110 正如你所看到的 列表 b 由一个列表的元素总和组成 其中 window 2 b 0 a 0 a 1 10 20 30 etc 如何获得另一个列表 该列表由
  • 张量流:注册 numpy bfloat16 扩展

    正如我所见 tensorflow 中有 bfloat16 的 numpy 扩展 https github com tensorflow tensorflow blob 24ffe9f729160a095a5cab8f592392018280
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide

随机推荐

  • 用于带有数据的 Union 类型的 Elm JSON 解码器

    我的 json 看起来像这样 name providerWithVal value example 或者像这样 name provider2 or name provider3 我的 Elm 联合类型定义如下 type Provider P
  • 为什么Sun 不做C# 到Java 字节码编译器?

    我们想要在 JVM 上运行 C 代码 我的公司拥有庞大的 C 代码库 超过一半的代码是我们用于创建 读取 修改 计算和编写 Excel 工作簿的核心引擎 我们经常收到客户和潜在客户的问题 询问我们是否要构建引擎的 Java 版本 他们中的许
  • 将iso8601字符串日期时间格式转换为Java中的日期[重复]

    这个问题在这里已经有答案了 All 我知道我之前曾问过类似的问题 关于使用 Java 将 ISO8601 日期字符串解析为日期 但这是使用 SimpleDateFormat 类的更具体的问题 我读过这篇文章维基 ISO8601 日期 htt
  • Qt OpenGL-如何根据鼠标点击获取对象

    我正在尝试在 Qt openGL 中制作应用程序 在这里 我必须根据鼠标单击来了解单击的对象 我的想法是存储点 QWidget 中的对象区域 并将鼠标单击与这些点相匹配 有人能说出如何做到这一点吗 或者任何人都可以展示其他方式吗 这个问题通
  • 单击 Jbutton 后如何显示/隐藏附加到 Jlabel 的图像?

    我是编程世界的新手 我需要一些帮助 我会尽量说得清楚 这是我目前的情况 我正在编写一个简单的游戏 在 Jframe 上 我添加了一个 Jlabel 在其上附加了图像 我还在 Jframe 上添加了一个 Jbutton 我希望当我单击 Jbu
  • 插座对比世界碳纤维

    我开发一个类似聊天的应用程序 在客户端使用 Silverlight 在服务器端使用 wpf 现在通信基于套接字 我有不同的消息类 我将它们序列化并通过 TCP 发送 我开始意识到为每个可能的通信场景创建单独的消息类是相当大的开销 并考虑迁移
  • 这个Python装饰器是如何工作的?

    我正在研究 Python 中的一些延迟加载属性装饰器 并且发生在这个示例中 http code activestate com recipes 363602 lazy property evaluation http code active
  • 将字符串变量中接收到的 pdf 文件转换为 C# 中的字节数组

    我正在尝试用 C 开发一个应用程序 它从 Service1 第 3 方 获取数据 对其进行处理 然后将数据发送到 Service2 又是第 3 方 我试图接收 处理和发送的数据是pdf file 从 Service1 我收到了 pdf 文件
  • AngularJS 指令链接函数未执行

    我正在为 jQuery 元素编写一个包装器 该元素是我正在使用的模板的一部分 此处示例中的链接方法 http jsfiddle net Webnet ugSsk http jsfiddle net Webnet ugSsk 没有被触发 我无
  • 调用需要 API 级别 26(当前最低为 23):java.time.Instant#now

    我正在实施Google 的路线 API https developers google com maps documentation directions start 我的应用程序支持minSdkVersion 23 and java ti
  • 如何在不要求用户登录 Laravel 的情况下验证电子邮件

    我正在开发一个 Laravel 应用程序 我的应用程序使用 Laravel 内置身份验证功能 在 Laravel auth 中 当用户注册时 会发送一封验证电子邮件 当用户验证电子邮件时 单击电子邮件内的链接 如果用户尚未登录 则必须重新登
  • 使用 Python 使用公钥和 cx_Oracle 进行身份验证

    我用谷歌搜索了一下 但没有找到任何实质性的结果 是否可以使用基于密钥的身份验证来使用 Python 连接到 Oracle 服务器 我的目标是能够自动化使用 Python 进行的一些报告 而无需在服务器中的任何位置存储用户名 密码 一种可能的
  • 从大浮点数中删除 E 符号,C#?

    如果您使用过大浮点数 您会发现在 C 中大浮点数显示如下 2000000 2000000 4E 12 我怎样才能展示4E 124 000 000 000 000 不4E 12 You want number ToString N0 N0 是
  • WinRT - 如何从导航历史记录中忽略或删除页面

    我的 WinRT Metro c xaml 应用程序中存在以下情况 用户启动应用程序 但他或她尚未登录 在菜单栏中 我有按钮将其导航到购物车 值得一提的是 无论登录 注销状态如何 他们都可以单击它 所以我有这个 Home Page gt L
  • 输入文件到达时如何启动批处理作业?

    我们有 Spring4 和 Spring Batch 3 我们的应用程序使用 CSV 文件作为输入文件 目前 我们使用 CommandLineJobRunner 和参数 包括要处理的文件的名称 从命令行手动启动作业 我想在输入文件到达受监视
  • opacity:0 与visibility:hidden 的效果完全相同吗

    如果是这样 它是否有效地弃用了visibility财产 我意识到 Internet Explorer 尚不支持此 CSS2 属性 布局引擎的比较 http en wikipedia org wiki Comparison of layout
  • 如何抓取给定时间段内的所有 subreddit 帖子

    我有一个功能可以抓取 2014 年 11 月 1 日到 2015 年 10 月 31 日期间比特币 subreddit 中的所有帖子 然而 我只能提取大约 990 个帖子 这些帖子只能追溯到 10 月 25 日 我不明白发生了什么 我在参考
  • 超时已过。在 Azure sql 上完成操作之前超时时间已过

    我需要在 windows azure 上的 global asax 应用程序启动事件上创建一个 sql 数据库 但是我收到此错误 Timeout expired The timeout period elapsed prior to com
  • 有没有办法查看进程每个核心的 CPU 使用率?

    我知道在 perfmon 中您可以看到每个核心的利用率 以及特定进程使用的总 CPU 量 然而 我似乎无法找到一种方法来查看进程使用了 多少CPU 按核心细分 有没有内置的方法来查看这些信息 有没有一种编程方式可以看到这一点 C 首选 我是
  • 如何在这段代码上应用 PyQt QThread

    coding utf 8 from PyQt5 QtWidgets import from PyQt5 QtCore import from PyQt5 QtGui import from PyQt5 uic import loadUiTy