我怎样才能阻止 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
部分,而是在于每次单击按钮时都会在 workers
和 QYD
之间添加信号槽连接对象。只需在 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))
我正在使用 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
部分,而是在于每次单击按钮时都会在 workers
和 QYD
之间添加信号槽连接对象。只需在 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))