2013-10-15 34 views
1

我写了一个小纸条,以对ubuntu.Here安装 软件是运行一个命令:显示安装进度在PyQt的

from PyQt4 import QtCore, QtGui 
    from subprocess import Popen,PIPE 

    try: 
     _fromUtf8 = QtCore.QString.fromUtf8 
    except AttributeError: 
     def _fromUtf8(s): 
      return s 

    try: 
     _encoding = QtGui.QApplication.UnicodeUTF8 
     def _translate(context, text, disambig): 
      return QtGui.QApplication.translate(context, text, disambig, _encoding) 
    except AttributeError: 
     def _translate(context, text, disambig): 
      return QtGui.QApplication.translate(context, text, disambig) 

    class Ui_MainWindow(object): 
     def setupUi(self, MainWindow): 
      MainWindow.setObjectName(_fromUtf8("MainWindow")) 
      MainWindow.resize(426, 296) 
      self.centralwidget = QtGui.QWidget(MainWindow) 
      self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
      self.btn = QtGui.QPushButton(self.centralwidget) 
      self.btn.setGeometry(QtCore.QRect(170, 190, 81, 27)) 
      self.btn.setObjectName(_fromUtf8("btn")) 
      MainWindow.setCentralWidget(self.centralwidget) 
      self.menubar = QtGui.QMenuBar(MainWindow) 
      self.menubar.setGeometry(QtCore.QRect(0, 0, 426, 25)) 
      self.menubar.setObjectName(_fromUtf8("menubar")) 
      MainWindow.setMenuBar(self.menubar) 
      self.statusbar = QtGui.QStatusBar(MainWindow) 
      self.statusbar.setObjectName(_fromUtf8("statusbar")) 
      MainWindow.setStatusBar(self.statusbar) 

      self.retranslateUi(MainWindow) 
      QtCore.QObject.connect(self.btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.runcmnd) 
      QtCore.QMetaObject.connectSlotsByName(MainWindow) 
     def runcmnd(self): 
      p = Popen('sudo apt-get install leafpad', stdout=PIPE,stderr=PIPE, shell=True) 
      out, err = p.communicate() 
      print out 


     def retranslateUi(self, MainWindow): 
      MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
      self.btn.setText(_translate("MainWindow", "ok", None)) 


    if __name__ == "__main__": 
     import sys 
     app = QtGui.QApplication(sys.argv) 
     MainWindow = QtGui.QMainWindow() 
     ui = Ui_MainWindow() 
     ui.setupUi(MainWindow) 
     MainWindow.show() 
     sys.exit(app.exec_()) 

现在我想一个酒吧,会显示安装进度。我知道 它可以使用pyqt进度条完成,但我不知道该怎么做。

回答

0

一个简单的方法是运行计时器,定期轮询进程的stdout,并相应地更新进度栏。

class Ui_MainWindow(object): 
    _timer = None 

    # ... 

    def runcmnd(self): 
     self.p = Popen #...skipped. Note that p is now a member variable 
     self._timer= QTimer(self) 
     self._timer.setSingleShot(False) 
     self._timer.timeout.connect(self.pollProgress) 
     self._timer.start(1000) # Poll every second; adjust as needed 

    def pollProgress(self): 
     output = self.p.stdout.read() 
     progress = # ...Parse the output and update the progress bar 
     if progress == 100: # Finished 
      self._timer.stop() 
      self._timer = None 

当然,需要进行一些错误检查(当网络出现故障时,用户输入错误的密码等)。

顺便说一句,Popen('sudo apt-get install leafpad')将无法​​正常工作。您需要

Popen(['sudo', 'apt-get', 'install', 'leafpad']) 
+0

谢谢@uranusjr。请为我说清楚一点。我只是一个初学者。我如何根据你的建议管理代码。请纠正我的错误: – user2420437

+0

def runcmnd(self): self.p = Popen(['sudo','apt-get','install','leafpad'])#...跳过。请注意,p现在是一个成员变量 self._timer = QtCore.QTimer(self) self._timer.setSingleShot(False) self._timer.timeout.connect(self.pollProgress) self._timer.start(1000) #每秒轮询一次;根据需要调整 – user2420437

+0

哦!为什么在http://stackoverflow.com写评论非常困难! – user2420437

0

谢谢。请为我说清楚一点。我只是一个初学者。你的意思是说,我必须设置一个动作计时器,然后按照时间更新进度条?这就是我根据你的建议管理代码的方法。请给我一个示例脚本或纠正我的错误,请:

class Ui_MainWindow(object): 
     _timer = None 
     def setupUi(self, MainWindow): 
      MainWindow.setObjectName(_fromUtf8("MainWindow")) 
      MainWindow.resize(426, 296) 
      self.centralwidget = QtGui.QWidget(MainWindow) 
      self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
      self.btn = QtGui.QPushButton(self.centralwidget) 
      self.btn.setGeometry(QtCore.QRect(170, 190, 81, 27)) 
      self.btn.setObjectName(_fromUtf8("btn")) 
      MainWindow.setCentralWidget(self.centralwidget) 
      self.menubar = QtGui.QMenuBar(MainWindow) 
      self.menubar.setGeometry(QtCore.QRect(0, 0, 426, 25)) 
      self.menubar.setObjectName(_fromUtf8("menubar")) 
      MainWindow.setMenuBar(self.menubar) 
      self.statusbar = QtGui.QStatusBar(MainWindow) 
      self.statusbar.setObjectName(_fromUtf8("statusbar")) 
      MainWindow.setStatusBar(self.statusbar) 

      self.retranslateUi(MainWindow) 
      QtCore.QObject.connect(self.btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.runcmnd) 
      QtCore.QMetaObject.connectSlotsByName(MainWindow) 
     def runcmnd(self): 
      self.p = Popen(['sudo', 'apt-get', 'install', 'leafpad']) 
      self._timer= QtCore.QTimer(self) 
      self._timer.setSingleShot(False) 
      self._timer.timeout.connect(self.pollProgress) 
      self._timer.start(1000) # Poll every second; adjust as needed 

     def pollProgress(self): 
      output = self.p.stdout.read() 
      progress = # ...Parse the output and update the progress bar 
      if progress == 100: # Finished 
       self._timer.stop() 
         self._timer = None