Показывать ход установки в 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?
  • Преобразовать двоичную строку базы-2 в int
  • IOError: Errno 2 Нет такого файла или каталога python
  • web.py в Google App Engine
  • Поиск и замена символов в файле с помощью Python
  • Python: вызов функции из имени строки
  • Что означает точка после целого значения в python?
  • python, ключевое слово «a in b», как насчет нескольких a?
  • Python - лучший язык программирования в мире.