首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我希望在两个setText之间做一些事情时,pyqt5 QLineEdit.setText只能在funcion中工作一次

当我希望在两个setText之间做一些事情时,pyqt5 QLineEdit.setText只能在funcion中工作一次
EN

Stack Overflow用户
提问于 2019-12-08 13:40:52
回答 1查看 106关注 0票数 1
代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QWidget, QLabel, QLineEdit
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import QSize , QTimer
from PyQt5.QtGui import * 
from pytube import YouTube
import os
import time
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(600, 200))    
        self.setWindowTitle("下載影片程式") 

        self.nameLabel = QLabel(self)
        self.nameLabel.setText('網址:')
        self.line = QLineEdit(self)

        self.line.move(80, 20)
        self.line.resize(500, 32)
        self.nameLabel.move(20, 20)

        pybutton = QPushButton('下載', self)
#        pybutton.clicked.connect(self.clickMethod)
        pybutton.clicked.connect(self.Download)
#        pybutton.clicked.connect(self.Download1)
        pybutton.resize(200,32)
        pybutton.move(80, 60)        

        self.statusline = QLineEdit(self)
        self.statusline.move(80, 100)
        self.statusline.resize(200, 32)

#        self.statusline1 = QLineEdit(self)
#        self.statusline1.move(80, 140)
#        self.statusline1.resize(200, 32)
#        
    def clickMethod(self):
        print('')
    def Download(self):
        self.statusline.setText('開始下載')
        if not os.path.isdir('D:\\下載影片'):
            os.mkdir('D:\\下載影片')
        yt = YouTube(self.line.text())



        video=yt.streams.filter(file_extension='mp4').first()
        video.download(r'D:\\下載影片')
        QTimer.singleShot(1000, lambda: self.statusline.setText('下載完成'))

#    def Download1(self):
#        self.statusline.setText('下載完成')


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit( app.exec_() )

我想在下载youtube之前显示'start‘,然后显示'finsh’。

但它总是只显示'finsh‘。

为什么当我点击QPushButton时,QLineEdit只显示'finsh‘?

EN

回答 1

Stack Overflow用户

发布于 2019-12-08 16:39:48

下载文件的任务可能需要很长时间,因此它会阻塞事件循环,导致GUI冻结,冻结的结果是GUI没有正确更新。

考虑到上述情况,解决方案是在另一个线程上执行下载。

代码语言:javascript
复制
import functools
import os
import sys

from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QSize, QThread, QTimer
from PyQt5.QtWidgets import (
    QApplication,
    QFormLayout,
    QLabel,
    QLineEdit,
    QMainWindow,
    QPushButton,
    QSizePolicy,
    QWidget,
)

from pytube import YouTube


class DownloadWorker(QObject):
    started = pyqtSignal()
    finished = pyqtSignal()

    @pyqtSlot(str, str)
    def download(self, url, path):
        self.started.emit()
        if not os.path.isdir(path):
            os.mkdir(path)
        try:
            yt = YouTube(url)
            video = yt.streams.filter(file_extension="mp4").first()
            video.download(path)
        except Exception as e:
            print(e)

        self.finished.emit()


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.setMinimumSize(QSize(600, 200))
        self.setWindowTitle("Download Video Program")

        self.line = QLineEdit()
        self.pybutton = QPushButton("download")
        self.pybutton.setFixedSize(200, 32)
        self.statusline = QLineEdit()
        self.statusline.setFixedSize(200, 32)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        lay = QFormLayout(central_widget)
        lay.addRow("URL:", self.line)
        lay.addRow("", self.pybutton)
        lay.addRow("", self.statusline)

        thread = QThread(self)
        thread.start()

        self.worker = DownloadWorker()
        self.worker.started.connect(self.on_started)
        self.worker.finished.connect(self.on_finished)
        self.worker.moveToThread(thread)

    def download(self):
        url = self.line.text()
        # TODO
        path = "/path/of/output.mp4"
        wrapper = functools.partial(self.worker.download, url, path)
        QTimer.singleShot(0, wrapper)

    @pyqtSlot()
    def on_started(self):
        self.statusline.setText("Started")
        self.pybutton.setEnabled(False)

    @pyqtSlot()
    def on_finished(self):
        self.statusline.setText("Finished")
        self.pybutton.setEnabled(True)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59232772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档