Показывать ход установки в PyQt

Я написал небольшой скрипт для запуска команды для установки программного обеспечения на ubuntu.Here это:

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, но я не знаю, как это сделать.

2 Solutions collect form web for “Показывать ход установки в PyQt”

Простым способом является запуск таймера, периодический опрос 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']) 

Спасибо. Пожалуйста, сделайте это немного понятным для меня. Я просто начинающий. Вы имеете в виду, что мне нужно установить таймер с действием, а затем обновить индикатор выполнения в соответствии со временем? Вот как я управлял кодами в соответствии с вашим предложением. Дайте мне просто образец сценария или исправьте мои ошибки, пожалуйста:

  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 
  • Строка справа налево заменяется на Python?
  • Python - Xlwt более 256 столбцов
  • Что означает это сообщение? from: не может читать / var / mail / ex48 (Learn Python the Hard Way ex49)
  • Как получить NaN, когда я делюсь на ноль
  • Создание условного класса (Python)
  • Использование god-подмодуля для импорта проекта python
  • Подсчет гласных
  • Вычислить длину тени с помощью PyEphem
  • Python - лучший язык программирования в мире.