2012-10-31 33 views
1

我对python非常陌生,并且正在学习这种强大的语言。我设法写下下面的脚本。它确实得到了部分输出(只有两行),我不知道出了什么问题!请帮帮我。使用QProcess输出youtube-dl

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 

from PyQt4 import QtCore, QtGui 
from PyQt4.QtCore import (QProcess,QRect,SIGNAL,SLOT,QString,QStringList,qDebug) 
from PyQt4.QtGui import (QMainWindow,QWidget,QPushButton,QTextEdit,QApplication) 

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

     self.resize(400,300) 
     self.setWindowTitle("Youtube-dl output using QProcess") 

     self.__init_Components() 
     self.__ui_event_handler() 

    def __init_Components(self): 
     self.proc = QProcess() 
     self.cw = QWidget(self) 

     self.btn = QPushButton(self.cw) 
     self.btn.setText("Run") 
     self.btn.setGeometry(QRect(270,10,110,27)) 

     self.te = QTextEdit(self.cw) 
     self.te.setReadOnly(True) 
     self.te.setOverwriteMode(False) 
     self.te.setGeometry(QRect(10,40,380,170)) 

     self.setCentralWidget(self.cw) 

    def __ui_event_handler(self): 
     self.connect(self.btn, SIGNAL('clicked()'),self.Button_Clicked) 


    def Button_Clicked(self): 
     args = '-ct -f 18 --extract-audio --audio-quality 320k --audio-format mp3 -k http://www.youtube.com/watch?v=OiPO_TAAZPc' 
     cmd = 'youtube-dl' 
     self.proc.setWorkingDirectory("~/Videos/Folder1") 
     self.connect(self.proc, SIGNAL('readyRead()'),self._read) 
     self.proc.setOpenMode(self.proc.ReadWrite) 
     self.proc.start(cmd ,args) 
     if not self.proc.waitForStarted(): 
      exit(1) 

    def _read(self): 
     s = self.proc.readAllStandardOutput() 
     qDebug (s) 
     print (s) 
     self.te.append(QString(s)) 



def main(): 
    import sys 
    app = QApplication(sys.argv) 
    ytdl = YTDL() 
    ytdl.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

你可以发表您的输入和输出部分,因为它是有关您的问题。另外,你想要你的脚本做什么,它在做什么? – 2012-10-31 03:02:25

+0

正如我写的,我想执行该命令以及在QtextEdit框中显示youtube-dl命令的输出。 – user1787326

+0

输出如下所示:[youtube]设置语言 [youtube] - :下载视频网页 – user1787326

回答

0

我想我自己想通了。以下是所有改进版本。如果有什么需要改进的地方,我会欢迎任何建议。

类YTDL(QtGui.QMainWindow): DEF 初始化(个体,父母=无): 超级(YTDL,自我)。 初始化(父)

self.resize(400,350) 
    self.setWindowTitle("Youtube-dl output using QProcess") 

    self.__init_Components() 
    self.__ui_event_handler() 

def __init_Components(self): 
    self.proc = QProcess() 
    self.cw = QWidget(self) 

    self.btn = QPushButton(self.cw) 
    self.btn.setText("Run") 
    self.btn.setGeometry(QRect(270,10,110,27)) 

    self.te = QTextEdit(self.cw) 
    self.te.setReadOnly(True) 
    self.te.setOverwriteMode(False) 
    self.te.setGeometry(QRect(10,40,380,170)) 

    self.progbar = QProgressBar(self.cw) 
    self.progbar.setGeometry(QRect(10,220,380,18)) 
    self.progbar.setRange(0,100) 
    self.progbar.setValue(0) 
    self.progbar.show() 

    self.setCentralWidget(self.cw) 

def __ui_event_handler(self): 
    self.connect(self.btn, SIGNAL('clicked()'),self.Button_Clicked) 
    self.connect(self.proc, SIGNAL('readyReadStandardOutput()'),self._read) 
    self.connect(self.proc, SIGNAL('readyReadStandardError()'),self._readError) 


def Button_Clicked(self): 

    args = "-ct -f 18 --extract-audio --audio-quality 320k --audio-format mp3 -k http://www.youtube.com/watch?v=SjUrib_Gh0Y" 
    cmd = "youtube-dl" 
    cmd = cmd + " " + args 
    print (cmd) 
    self.proc.setWorkingDirectory("~/Videos/Folder1") 
    self.proc.setOpenMode(self.proc.ReadWrite) 
    self.proc.start(cmd) 
    self.proc.waitForStarted() 


def _read(self): 
    s = str(self.proc.readAllStandardOutput()) 

    download_progress_exp = re.compile(r'.\d+\.\d+\%', re.MULTILINE) 
    progbarresult = download_progress_exp.findall(s) 
    i = 0 
    if progbarresult != []: 
     for i in range(0,len(progbarresult)): 
      self.progbar.setValue(float(progbarresult[i].strip("%"))) 
      self.te.append(QString(s)) 



def _readError(self): 
    self.te.append(str(self.proc.readAllStandardError()))