Python - Como incorporar Thread y witgets de pyqt5 en mi código

 
Vista:
Imágen de perfil de Jose A.
Val: 13
Ha disminuido su posición en 10 puestos en Python (en relación al último mes)
Gráfica de Python

Como incorporar Thread y witgets de pyqt5 en mi código

Publicado por Jose A. (12 intervenciones) el 18/01/2022 19:19:43
Después de hacer unas cuantas pruebas con lo que he ido encontrando en las webs para lo que necesito, no logro comprender el funcionamiento de los hilos, señales y witges, he visto varios con barras de progreso, pero todos se hacen desde el hilo principal y no logro comprender los que se hacen desde fuera, para adaptarlo a mi código, por lo que os pido una orientación o ayuda, a continuación os pongo una especie de pseudocódigo a grosso modo, con lo que tengo, y lo que necesito.
Windows 10
python 3.9.6
Visual Studio Code 1.63.2
Comentario: pteSalida - QTextEdit como Richtext para admitirme texto plano y html (texto con colores) y donde necesito que se escriban los mensajes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class Ventana (QMainWindow)
    def __init__ (self)
        super(Ventana1, self).__init__()
        uic.loadUi('D:/python/sor/sor.ui',self)
        timer = QTimer(self)
        timer.timeout.connect(self.MostrarHora)
        timer.start(1000)
 
def MostrarHora(self):
    dia, rem =divmod(time.time() - comienzo, 86400)
    hours, rem = divmod(rem, 3600)
    minutes, seconds = divmod(rem, 60)
    self.lbDias.setText("{:0>2}".format(int(dia)))
    self.lbDias_2.setText("{:0>2}:{:0>2}:{:02.0f}".format(int(hours),int(minutes),seconds))
    self.tlreloj.setText(QDateTime.currentDateTime().toString("dddd d 'de' MMMM 'de' yyyy HH:mm:ss"))
 
    if config.get('FRECUENCIA') == self.tlreloj.text()[len(self.tlreloj.text())-4:]:
        self.LW = threading.Thread(target=self.Llamar)
        self.LW.start()
 
def Llamada(self):
    # PROCESO1
    if 1 == 1: #<- me falta imaginación para inventarme ésta y otras condiciones. :-D
                # Ésta no es el problema ;-}
        pteSalida.insertTextPlain('hago proceso1')
        P1 = threading.Thread(target=self.Proceso1,args=(fecha,texto))<--- los argumentos a pasar son diferentes
        P1.start()
    else:
        pteSalida.insertHtml('<font color = "#FF4500"> Proceso1 no se realiza</font>.-<br>')
    pteSalida.moveCursor(QtGui.QTextCursor.End) # <<-- Lo hago para que los mensajes siempre queden arriba
 
    # PROCESO2
    if 2 == 2: #<- me falta imaginación para inventarme ésta y otras condiciones. :-D
                # Ésta no es el problema ;-}
        pteSalida.insertTextPlain('hago proceso2')
        P2 = threading.Thread(target=self.Proceso2,args=(fecha,texto,NUMERO))<--- los argumentos a pasar son diferentes
        P2.start()
    else:
        pteSalida.insertHtml('<font color = "#FF4500"> Proceso2 no se realiza</font>.-<br>')
    pteSalida.moveCursor(QtGui.QTextCursor.End) # <<-- Lo hago para que los mensajes siempre queden arriba
 
    # PROCESO3
    if 3 == 3: #<- me falta imaginación para inventarme ésta y otras condiciones. :-D
                # Ésta no es el problema ;-}
        pteSalida.insertTextPlain('hago proceso3')
        P3 = threading.Thread(target=self.Proceso3,args=(fecha,texto,LINEA))<--- los argumentos a pasar son diferentes
        P3.start()
    else:
        pteSalida.insertHtml('<font color = "#FF4500"> Proceso3 no se realiza</font>.-<br>')
    pteSalida.moveCursor(QtGui.QTextCursor.End) # <<-- Lo hago para que los mensajes siempre queden arriba
 
## HAY MAS PROCESOS... PERO CON ESTOS ME BASTAN.
 
def Proceso1(self,FF,TT):
    pteSalida.insertHtml('<font color = "#FF4500"> Proceso1 iniciado....</font>.-<br>')
 
    .... busco información en una tabla y que lleva su tiempo....
 
    if errorbusqueda:
        pteSalida.insertHtml('<font color = "#FF4500"> Proceso1 encontrado error en ....</font>.-<br>')
 
    pteSalida.insertHtml('<font color = "#000080"> Proceso1 acabado.- </font>.-<br>')
    pteSalida.moveCursor(QtGui.QTextCursor.End) # <<-- Lo hago para que los mensajes siempre queden arriba
 
def Proceso2(self,FF,TT,NN):
    pteSalida.insertHtml('<font color = "#FF4500"> Proceso2 iniciado....</font>.-<br>'+ FF)
 
    if errorbusqueda:
        pteSalida.insertHtml(NN + '<font color = "#FF4500"> Proceso2 encontrado error en ....</font>.-<br>')
 
    pteSalida.insertHtml('<font color = "#000080"> Proceso2 acabado.- </font>.-<br>')
    pteSalida.moveCursor(QtGui.QTextCursor.End) # <<-- Lo hago para que los mensajes siempre queden arriba
 
def Proceso3(self,FF,TT,LL):
    pteSalida.insertHtml('<font color="#FF4500"> Proceso3 iniciado....</font>.-<br>'+ FF)
 
    if errorbusqueda:
        pteSalida.insertHtml('<font color="#FF4500"> Proceso3</font> encontrado error en '+ LL +' .....' + FF+ ' texto: ' + TT + '-<br>')
 
    pteSalida.insertHtml('<font color = "#000080"> Proceso2 acabado.- </font>.-<br>')
    pteSalida.moveCursor(QtGui.QTextCursor.End) # <<-- Lo hago para que los mensajes siempre queden arriba
 
if __name__ == '__main__':
    locale.setlocale(locale.LC_ALL, 'es_ES.utf-8')
    comienzo = time.time()
    # Las defino aquí para que sean globales.-
    configini = dict()
    config = dict()
    correos = []
    tab ="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
    Sor = QApplication(sys.argv)
    GUI = Ventana()
    GUI.show()
    sys.exit(Sor.exec())

¿De que forma podría hacer mi código para que en pteSalida se muestren los mensajes sin que me salga

1
QObject::connect: Cannot queue arguments of type 'QTextCursor'

Lo que pretendo es que en pteSalida se muestren los mensajes de los procesos, y tienen que ir secuencialmente y ordenados, unas veces se ejecutaran todos, alguno o ninguno, sin usar una lista de hilos. No quiero el código, me gustaría saber como modular mi código para que funcione y comprender su funcionamiento, porque tengo otra actualización de lenguaje y necesitaría lo mismo.

Os doy las gracias desde este momento.

PD: No son deberes, ni trabajo (que mas quisiera), es hobby(?)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder