Изменение ProgressBar по итерациям в функции?
Добрый день, есть функция:
def mathfunc(Uin, Uref, PulseTime, PulseNumbers, time_step):
time = time_step
compare = 1
R = 0
i = 1
time_values = []
Usig = []
PulseMomemnt = PulseTime
Dout = []
Dout.insert(0, 1)
while time <= PulseTime * PulseNumbers:
if compare == 1:
R = R + ((Uin[i - 1] + Uin[i]) / 2 + Uref) * time_step
Usig.append(R)
else:
R = R + ((Uin[i - 1] + Uin[i]) / 2 - Uref) * time_step
Usig.append(R)
i += 1
self.setProgressVal(i)
time = time + time_step
if time > PulseMomemnt:
if R >= 0:
compare = 0
else:
compare = 1
PulseMoment = PulseMoment + PulseTime
Dout.append(compare)
time_values.append(time)
return [Usig, Dout, time_values]
Хочу сделать так, что бы в функции при каждой пройденной итерации обновлялся QProgressBar. Понимаю что нужно использовать QThread, но как его подружить например с переменной i в функции?
class MyThread(QThread):
change_value = pyqtSignal(int)
def run(self):
cnt = 0
while cnt < 100:
cnt+=1
time.sleep(0.03)
self.change_value.emit(cnt)
и функции:
def startProgressBar(self):
self.thread = MyThread()
self.thread.change_value.connect(self.setProgressVal)
self.thread.start()
def setProgressVal(self, val):
self.progressbar.setValue(val)
Дополнительно:
Ответы:
Добавь функции ещё один параметр - callback-функцию, которая будет вызываться каждые X итераций.
Тогда вопрос "как подружить функцию с индикацией прогресса" сведётся к написанию подходящей callback-функции. Условно:
from time import sleep def worker(n: int, cb=None): for i in range(n): sleep(0.2) # работу работаем if cb is not None and i % 5 == 0: cb(i, n) # оповещаем, если пора и если есть что if cb is not None: cb(n, n) # последнее оповещение на 100%. можно убрать # использование def callback(i, n): # callback для вывода прогресса в консоль print(f'{i/n:.1%}') # выводим процент завершения worker(50, callback) # работаем |
from time import sleep def worker(n: int, cb=None): for i in range(n): sleep(0.2) # работу работаем if cb is not None and i % 5 == 0: cb(i, n) # оповещаем, если пора и если есть что if cb is not None: cb(n, n) # последнее оповещение на 100%. можно убрать # использование def callback(i, n): # callback для вывода прогресса в консоль print(f'{i/n:.1%}') # выводим процент завершения worker(50, callback) # работаем
- Спасибо за ответ, да последний вопрос у меня и вызывает самые большие трудности, потому что не знаю как правильно передавать эти значения в Qthread что бы ProgressBar работал одновременно с вычислениями функции.
- apkaevi, ну тут я не помощник - я не работал с QT и не знаю, являются ли потокобезопасными обращения к элементами управления. Вроде в большинстве GUI-фреймворков они НЕ потокобезопасные, а значит, тебе нужен способ вызвать код в контексте главного потока. Вроде что-то упоминается, что если ты соединяешь сигнал одного потока со слотом в другом потоке, то код выполняется в контексте потока-владельца слота.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для изменения ProgressBar во время выполнения функции по итерациям, вам нужно использовать функцию обновления состояния ProgressBar после каждой итерации. В зависимости от того, на каком языке программирования вы пишете, это может быть реализовано по-разному.
Например, если вы пишете на языке PHP, вы можете использовать следующий код:
function updateProgressBar($current, $total) { $progress = ($current / $total) * 100; echo "document.getElementById('progress-bar').style.width = '". $progress ."%';"; } $iterations = 100; for ($i = 0; $i < $iterations; $i++) { // Выполнение операций // ... // Обновление ProgressBar updateProgressBar($i, $iterations); }
В этом примере функция updateProgressBar принимает текущее значение и общее количество итераций, вычисляет прогресс в процентах и обновляет состояние ProgressBar на странице. Затем после каждой итерации вызывается эта функция для обновления ProgressBar.
Если вы используете другой язык программирования, подобный подход может быть реализован с использованием соответствующих инструментов для работы с DOM и обновления элементов на странице в реальном времени.