我怎样才能阻止 QThread 在 python PyQt5 中重复函数?

How can i stop QThread from repeating function in python PyQt5?

我正在使用 pafy 模块下载 youTube 视频,当我单击“获取质量”按钮时,它第一次完美运行,但当尝试为另一个视频获取质量时,该功能有时会重复。

获取质量按钮将获取视频的名称和质量

如果我使用 terminate() 它不会第二次工作...

我的整个代码和 widget.ui 这里:https://pastebin.com/0kityt79

看看这些图片你就会明白我的意思了。

第一次点击获取质量

第二次点击获取质量

class KYD(QWidget,myui):

    urlSignal = pyqtSignal(str)

    def __init__(self,parent=None):
        super(QWidget,self).__init__(parent)

        self.get_quality_btn.clicked.connect(self.getQuality_vdieos)


        self.worker=workers()
        self.mythread=QThread()

    def getQuality_vdieos(self):
        try:
            url=self.Url.text()
            self.worker.moveToThread(self.mythread)
            self.urlSignal.connect(self.worker.qualities)
            self.urlSignal.emit(url) #this will send url to workers class,qualities function

            self.mythread.start()

            self.worker.info.connect(self.information)#this will send the title of the videos to the QTreeView

            self.worker.urlLink.connect(self.insertQulaity)

        except Exception as e:
            print(str(e))

    def insertQulaity(self,values):
        try:
            for qualities in values:
                self.chooseQuality.addItem(str(qualities),qualities)
        except Exception as e:
            print(str(e))

Class workers(QObject)

    info=pyqtSignal(str)
    urlLink=pyqtsignal(list)

    def __init__(self):
        super().__init__()

    def qualities(self, url):
        try:
            if url !='':
                self.source = pafy.new(url)
                self.videos_streams = self.source.videostreams
                self.info.emit(self.source.title) #this will send title to TreeView
                for self.videos in self.videos_streams:
                    size=humanize.naturalsize(self.videos.get_filesize())
                    data=['{}     {}     {}'.format(self.videos.resolution,self.videos.extension,size)]  
                    self.urlLink.emit(data) #this will send quality to Combobox

        except Exception as e:
            print(str(e))

问题不在于 QThread 部分,而是在于每次单击按钮时都会在 workersQYD 之间添加信号槽连接对象。只需在 QYD.__init__ 而不是 QYD.getQuality 中创建您需要的所有连接。此外,您不必启动线程,也不必在每次按下按钮时将工作线程移动到线程,这样您就可以将所有这些都移动到 QYD.__init__。所以总而言之,QYD 应该类似于

class KYD(QWidget,myui):

    urlSignal = pyqtSignal(str)

    def __init__(self,parent=None):
        super(QWidget,self).__init__(parent)

        self.get_quality_btn.clicked.connect(self.getQuality_vdieos)

        self.mythread=QThread()
        self.worker=workers()
        self.worker.moveToThread(self.mythread)

        self.worker.info.connect(self.information)
        self.worker.urlLink.connect(self.insertQulaity)
        self.urlSignal.connect(self.worker.qualities)

        self.mythread.start()

    def getQuality_vdieos(self):
        try:
            url=self.Url.text()
            self.urlSignal.emit(url) 
        except Exception as e:
            print(str(e))