@apkaevi

Изменение 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)
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Добавь функции ещё один параметр - 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)  # работаем
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы