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
¿De que forma podría hacer mi código para que en pteSalida se muestren los mensajes sin que me salga
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(?)
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 =" "
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


0