0

I'm making a simple audio downloader from video,but whenever i click download button gui stops until downloading has finished. I thought i can use threading for kind of these things but almost there are hundreds of method to achieve that,but i don't know which one i should choose and that's why I'm so confused then wanted to ask you.

My code here:

import sys
import threading
import pafy
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

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):
        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_())

Have changed the code a little and it works,thanks for everyone.

import sys
import threading
import pafy
from time import sleep
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

class 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()

    def threaded(self):
        url = self.line.text()
        video = pafy.new(url)

        bestaudio = video.getbestaudio()
        bestaudio.download()

if __name__ == '__main__':
    app = QApplication([])
    ex = App()
    sys.exit(app.exec_())
4

1 回答 1

1
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_())

try this!

In fact download task is done synchronously so your theard will block until the download task is over...you have to put this part of your code inside a daemon thread.

Note: I don't know if python thread can be mixed with Qt so you should use the good Lib but the idea remains the same

于 2020-04-15T23:31:37.807 回答