Я хотел бы запустить индикатор в другом потоке от остальной части моего кода, но я хотел бы контролировать, как прогресс бар обновление от моего основного потока.Запуск прогресс бара в другом потоке - PySide
Является ли это то, что можно?
Это то, что я до сих пор:
import time
from PySide import QtGui
from PySide import QtCore
from PySide import QtUiTools
class progressBar(QtGui.QDialog, QtCore.QThread):
def __init__(self, window, title=None):
super(progressBar, self).__init__(window)
QtCore.QThread.__init__(self)
self.title = title or 'Progress'
self.setupUi()
self.show()
def setupUi(self):
self.setObjectName("Thinking")
self.gridLayout = QtGui.QGridLayout(self)
self.gridLayout.setObjectName("gridLayout")
self.progressBar = QtGui.QProgressBar(self)
self.gridLayout.addWidget(self.progressBar, 0, 0, 1, 1)
# ADJUSTMENTS
self.setMaximumSize(280, 50)
self.setMinimumSize(280, 50)
self.setWindowTitle(self.title)
def increase(self, inc):
self.progressBar.setProperty("value", inc)
time.sleep(0.01)
def run(self):
for i in range(1,101):
self.increase(i)
progressThread = progressBar(QtGui.QApplication.activeWindow())
progressThread.start()
Это, кажется, работает индикатор прогресса правильно внутри нити, но она управляется полностью с помощью функции выполнения.
Я попытался удалить функцию запуска и добавления этого кода в моей основной теме:
progressThread = progressBar(QtGui.QApplication.activeWindow())
progressThread.start()
for i in range(1,101):
progressThread.increase(i)
Но это, похоже, не работает.
Любая помощь с этим было бы здорово ... Спасибо
Обратите внимание, что 'QThread's жить в потоке, который создал их (в этом случае основной поток), * не * в потоке, которыми они управляют. Этот код все еще выполняет всю свою работу в основном потоке. Вы должны вызвать метод moveToThread для панели выполнения, чтобы переместить ее в поток, управляемый объектом 'QThread'. Но также обратите внимание, что обычно не рекомендуется иметь объекты GUI в потоках, отличных от основного потока. – bnaecker
У вас не может быть объектов GUI во всем, кроме основного потока/цикла событий. Вы можете отслеживать прогресс в другом потоке и отправлять сигналы в основной поток, чтобы обновить индикатор выполнения. –
Вы также можете выполнить обновление через слоты и сигналы, чтобы он мог обновляться через потоки. –