в приложении PyQt5 поток QThread выполняется, но только после завершения основного цикла

написал двухоконное приложение для обработки веб-формы. первое окно авторизация, второе - обработка. переход между окнами через контроллер: class Controller:

def __init__(self):
    pass

def select_forms(self, text):
    if text == '1':
        self.form1 = my_pass()
        self.form1.switch_window.connect(self.select_forms)
        self.form1.show()

    if text == '2':
        self.form2 = mywindow()
        self.form2.switch_window.connect(self.select_forms)
        self.form2.show()
        self.form1.close()

на второй форме(окне) class mywindow(QtWidgets.QMainWindow): присутствует tableView. в цикле по строкам данной таблицы обрабатывается Web-окно:

 def GoGo(self):
     model = self.ui.tableView.model()
     nrow = model.rowCount(1)
   
     for row in range(nrow):
         
            обработка Web

решил добавить progressBar, для этого:

  1. Создал класс

'

class External(QThread):
            countChanged = QtCore.pyqtSignal(int)
        
            def __init__(self, parent = None ):
             super().__init__()
             self.pos_p = None
             self.all_p = None
        
        
            def run(self):
             if (self.pos_p != None and  self.all_p != None):
              count = round((self.pos_p/self.all_p)*100)
              self.countChanged.emit(count)

'

  1. Создал экземпляр класса и привязал функцию

'

class mywindow(QtWidgets.QMainWindow):
    switch_window = QtCore.pyqtSignal(str)
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QApplication.clipboard().dataChanged.connect(self.change_buffer)
        
          здесь       
        #self.percent_prog = External(None)
        #self.percent_prog.countChanged.connect(self.onCountChanged)
 '      
  1. в цикле передаю параметры экземпляру класса и стартую

'

def GoGo(self):
 model = self.ui.tableView.model()
 nrow = model.rowCount(1)
 
 for row in range(nrow):

     # здесь
     #self.percent_prog.all_p = nrow
     #self.percent_prog.pos_p = row+1
     #self.percent_prog.start()
     # здесь
     обработка Web

'

функция

def onCountChanged(self, value):
     self.ui.progressBar.setValue(value)

срабатывает необходимое количество раз, но только после отработки всего цикла for row in range(nrow):

помогите пожалуйста исправить

@S. Nick

введите сюда описание изображения

введите сюда описание изображения

def onCountChanged(self, value):

    self.ui.progressBar.setValue(value)
    print("position ProgresBar    =    " + str(value))

def GoGo(self):
 model = self.ui.tableView.model()
 nrow = model.rowCount(1)
 
 for row in range(nrow):
     time.sleep(1)
     # поток
     self.percent_prog.all_p = nrow
     self.percent_prog.pos_p = row+1
     self.percent_prog.start()
     # поток
     

     index = model.index(row, 1)
     Tip = model.data(index, Qt.DisplayRole)
     print("processing row" + str(row)+"   value = " + Tip)

Ответы (0 шт):