PyQt5:想要通过单击按钮来启动特定的子流程

时间:2017-02-16 17:29:01

标签: python pyqt pyqt5

在使用PyQT方面有一天的时间,我按照示例代码HERE执行此操作,但我对如何将启动下载部分与启动GUI部分分开无能为力,因此我可以而是在我按下OK(startBtn)按钮时开始。另外,知道我所做的命令除了给你一个错误之外什么都不做,但我知道这有效 任何帮助表示赞赏!

from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, qApp, QDesktopWidget, QPushButton, QHBoxLayout, QVBoxLayout, QTextEdit
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QThread, QProcess
import sys


class GUI(QProcess):
    def __init__(self):
        super().__init__()

        # Create an instance variable here (of type QTextEdit)
        startBtn = QPushButton('OK')
        stopBtn = QPushButton('Cancel')

        #startBtn.clicked.connect()
        stopBtn.clicked.connect(qApp.exit)

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addWidget(startBtn)
        self.hbox.addWidget(stopBtn)
        self.edit = QTextEdit()

        self.edit.setWindowTitle("QTextEdit Standard Output Redirection")

        self.vbox = QVBoxLayout()
        self.vbox.addStretch(1)
        self.vbox.addWidget(self.edit)
        self.vbox.addLayout(self.hbox)

        #setLayout(self.vbox)
        self.central=QWidget()

        #self.vbox.addWidget(self.edit)
        self.central.setLayout(self.vbox)
        self.central.show()

    def readStdOutput(self):
        self.edit.append(str(self.readAllStandardOutput()))




def main():
    app = QApplication(sys.argv)
    qProcess = GUI()

    qProcess.setProcessChannelMode(QProcess.MergedChannels);
    qProcess.start("youtube-dl")
    qProcess.readyReadStandardOutput.connect(qProcess.readStdOutput);

    return app.exec_()


if __name__ == '__main__':
    main()

2注:

  1. 如果您在按下按钮时也知道如何禁用“确定”按钮,直到完成该过程,那么我很想知道。

  2. 并非所有导入都被使用,但我可以稍后清理它。 PyCharm显示使用和不使用。清理是为了以后。

1 个答案:

答案 0 :(得分:2)

要做你要求你必须考虑的事情:

  • youtube-dl需要参数,例如网址,为此我放置了QLineEdit

  • 要了解流程何时开始和结束,我们会使用以下信号:stateChanged(newState)

完整代码:

import sys

from PyQt5.QtCore import QProcess
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QTextEdit, QLabel, QLineEdit


class GUI(QProcess):
    def __init__(self, parent=None):
        super(GUI, self).__init__(parent=parent)

        # Create an instance variable here (of type QTextEdit)
        self.startBtn = QPushButton('OK')
        self.stopBtn = QPushButton('Cancel')

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addWidget(self.startBtn)
        self.hbox.addWidget(self.stopBtn)

        self.label = QLabel("Url: ")
        self.lineEdit = QLineEdit()

        self.lineEdit.textChanged.connect(self.EnableStart)

        self.hbox2 = QHBoxLayout()
        self.hbox2.addWidget(self.label)
        self.hbox2.addWidget(self.lineEdit)

        self.edit = QTextEdit()
        self.edit.setWindowTitle("QTextEdit Standard Output Redirection")

        self.vbox = QVBoxLayout()
        self.vbox.addStretch(1)

        self.vbox.addLayout(self.hbox2)
        self.vbox.addWidget(self.edit)
        self.vbox.addLayout(self.hbox)

        self.central = QWidget()

        self.central.setLayout(self.vbox)
        self.central.show()

        self.startBtn.clicked.connect(self.startDownload)
        self.stopBtn.clicked.connect(self.kill)
        self.stateChanged.connect(self.slotChanged)

        self.EnableStart()

    def slotChanged(self, newState):
        if newState == QProcess.NotRunning:
            self.startBtn.setDisabled(False)
        elif newState == QProcess.Running:
            self.startBtn.setDisabled(True)

    def startDownload(self):
        self.start("youtube-dl", [self.lineEdit.text()])

    def readStdOutput(self):
        self.edit.append(str(self.readAllStandardOutput()))

    def EnableStart(self):
        self.startBtn.setDisabled(self.lineEdit.text() == "")


def main():
    app = QApplication(sys.argv)
    qProcess = GUI()

    qProcess.setProcessChannelMode(QProcess.MergedChannels)
    qProcess.readyReadStandardOutput.connect(qProcess.readStdOutput)

    return app.exec_()


if __name__ == '__main__':
    main()

截图:

enter image description here