将计时器与QThread一起使用

时间:2018-10-23 04:07:10

标签: python python-3.x pyqt pyqt5 qtimer

我遇到这样的错误:

QObject::startTimer: Timers can only be used with threads started with QThread

我的整个密码:

from PyQt5.QtWidgets import *
from newCode import mp3Download
from PyQt5.QtCore import QTimer,QThread
from threading import Thread
import sys


class ListDownload(QWidget):
    def __init__(self,path):
        super().__init__()
        self.path = path
        self.time = 100
        self.initUI()
    def initUI(self):
        self.VerticalLayout = QVBoxLayout()

        self.SeasonOfWitch = QLabel()
        self.SeasonOfWitch.setText("Enter the URLs : ")

        self.URLs = QTextEdit()
        self.URLs.setText("""enter the addresses in the here .a row for each url.
        Delete this message before entering the URLs.""")

        self.horizontalControlLayout = QHBoxLayout()
        self.download = QPushButton("Download")
        self.download.clicked.connect(self.videoDownload)

        self.Cancel = QPushButton("Cancel")
        self.Cancel.clicked.connect(self.cancelFunc)
        self.horizontalControlLayout.addWidget(self.download)
        self.horizontalControlLayout.addWidget(self.Cancel)


        self.VerticalLayout.addWidget(self.SeasonOfWitch)
        self.VerticalLayout.addWidget(self.URLs)
        self.VerticalLayout.addLayout(self.horizontalControlLayout)

        self.setLayout(self.VerticalLayout)        

    def cancelFunc(self):
        self.close()

    def videoDownload(self):
        self.urlList = self.URLs.toPlainText().split("\n")
        row = 1
        errorList = list()
        for url in self.urlList:
            if 'www.youtube.com' in url.split("/") and (url.startswith("https://") or url.startswith("http://")):
                row+=1

            else:
                errorList.append(row)
                row+=1

        decrease = 0#Each element deleting index changes the lenght of the list.Cause of that.
        for row in errorList:
            self.urlList.pop(row-1-decrease)
            decrease += 1

        messageObj = Thread(target=self.messageAnimation,name="message")
        downloadObj = Thread(target=self.downloadFunc,name="download")


        messageObj.start()
        downloadObj.start()

        while not(downloadObj.is_alive()):
            messageObj._stop()

    def downloadFunc(self):
        mp3Download(self.urlList,self.path)

    def messageAnimation(self):
        def timerFunc():
            self.animatedMessageFunc("Downloading ....")

        self.timer = QTimer()
        self.timer.timeout.connect(timerFunc)
        self.timer.start(1000)    


    def remove_widget(self,layout,widget_name):
        layout.removeWidget(widget_name)
        widget_name.deleteLater()
        widget_name = None

    def animatedMessageFunc(self,message):
        animatedMessage = message
        self.URLs.clear()
        iterator = iter(range(len(animatedMessage)))
        for i in range(len(animatedMessage)):
            QTimer.singleShot(self.time,lambda :self.URLs.setText(self.URLs.toPlainText()+animatedMessage[next(iterator)]))
            self.time += 50
        self.time = 100

问题在于计时器。在animatedMessageFunc()中。我要启动两个功能 同时。我使用Thread模块中的threading类。我想要因为 self.downloadFunc()结束时,我需要停止self.messageAnimation()函数。我尝试使用QThread而不是Thread。但是我不知道该如何使用这个类。有我的错误。但是在Java或其他语言中却有错误。在这些问题中我找不到解决方案。

1 个答案:

答案 0 :(得分:2)

计时器不必在另一个线程中,它足以在线程启动时启动并在线程结束其任务时停止它,为此,我们创建了两个信号:started和{{1 }},分别在调用finished函数之前和之后发出。

mp3Download()