Изменение ProgressBar по итерациям в функции?

Ссылка скопирована
1 ответ

Добрый день, есть функция:

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-фреймворков они НЕ потокобезопасные, а значит, тебе нужен способ вызвать код в контексте главного потока. Вроде что-то упоминается, что если ты соединяешь сигнал одного потока со слотом в другом потоке, то код выполняется в контексте потока-владельца слота.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

Для изменения 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 &lt; $iterations; $i++) {
    // Выполнение операций
    // ...
 
    // Обновление ProgressBar
    updateProgressBar($i, $iterations);
}

function updateProgressBar($current, $total) { $progress = ($current / $total) * 100; echo "document.getElementById('progress-bar').style.width = '". $progress ."%';"; } $iterations = 100; for ($i = 0; $i &lt; $iterations; $i++) { // Выполнение операций // ... // Обновление ProgressBar updateProgressBar($i, $iterations); }

В этом примере функция updateProgressBar принимает текущее значение и общее количество итераций, вычисляет прогресс в процентах и обновляет состояние ProgressBar на странице. Затем после каждой итерации вызывается эта функция для обновления ProgressBar.

Если вы используете другой язык программирования, подобный подход может быть реализован с использованием соответствующих инструментов для работы с DOM и обновления элементов на странице в реальном времени.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно