为了账号安全,请及时绑定邮箱和手机立即绑定

如何在函数中使用线程来防止 gui 冻结?

如何在函数中使用线程来防止 gui 冻结?

森栏 2022-10-11 17:09:53
我正在从视频制作一个简单的音频下载器,但是每当我单击下载按钮时,gui 都会停止,直到下载完成。我以为我可以使用线程来处理这些事情,但几乎有数百种方法可以实现这一点,但我不知道我应该选择哪一种,这就是为什么我很困惑然后想问你的原因。我的代码在这里:import sysimport threadingimport pafyfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButtonfrom PyQt5.QtGui import QIconfrom PyQt5.QtCore import pyqtSlotclass App(QWidget):    def __init__(self):        super().__init__()        self.title = 'PyQt5 button - pythonspot.com'        self.left = 100        self.top = 100        self.width = 320        self.height = 200        self.initUI()    def initUI(self):        self.setWindowTitle(self.title)        self.setGeometry(self.left, self.top, self.width, self.height)        button = QPushButton('Coffee shop radio', self)        button.move(10,10)        button.clicked.connect(self.on_click)        self.show()    def on_click(self):        url = "https://www.youtube.com/watch?v=IcvruhYk0po"        video = pafy.new(url)        bestaudio = video.getbestaudio()        bestaudio.download()if __name__ == '__main__':    app = QApplication([])    ex = App()    sys.exit(app.exec_())稍微修改了代码,它可以工作了,谢谢大家。import sysimport threadingimport pafyfrom time import sleepfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEditfrom PyQt5.QtGui import QIconfrom PyQt5.QtCore import pyqtSlotclass App(QWidget):    threads = []    def __init__(self):        super().__init__()        self.title = 'YouDio'        self.left = 100        self.top = 100        self.width = 280        self.height = 90        self.initUI()    def initUI(self):        self.setWindowTitle(self.title)        self.setGeometry(self.left, self.top, self.width, self.height)        button = QPushButton('DOWNLOAD', self)        button.move(10,25)        button.clicked.connect(self.on_click)        self.line = QLineEdit(self)        self.line.move(120,27)        self.show()    def on_click(self):        self.t = threading.Thread(target=self.threaded)        self.t.start()
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

from threading import Thread

import sys

import threading

import pafy

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

from PyQt5.QtGui import QIcon

from PyQt5.QtCore import pyqtSlot



def download_me():

    url = "https://www.youtube.com/watch?v=IcvruhYk0po"

    video = pafy.new(url)


    bestaudio = video.getbestaudio()

    bestaudio.download()  


class App(QWidget):


    def __init__(self):

        super().__init__()

        self.title = 'PyQt5 button - pythonspot.com'

        self.left = 100

        self.top = 100

        self.width = 320

        self.height = 200

        self.initUI()


    def initUI(self):

        self.setWindowTitle(self.title)

        self.setGeometry(self.left, self.top, self.width, self.height)


        button = QPushButton('Coffee shop radio', self)

        button.move(10,10)

        button.clicked.connect(self.on_click)


        self.show()


    def on_click(self):

        t = Thread(target=download_me)

        t.daemon = True

        t.start()




if __name__ == '__main__':

    app = QApplication([])

    ex = App()

    sys.exit(app.exec_())

尝试这个!


实际上下载任务是同步完成的,所以你的ardard会阻塞直到下载任务结束……你必须把这部分代码放在一个守护线程中。


注意:我不知道 python 线程是否可以与 Qt 混合,所以你应该使用好的 Lib 但想法保持不变


查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信