IIC2233 / syllabus-2020-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉🎊
35 stars 68 forks source link

Envío de imagenes desde el servidor #1134

Closed lewebe closed 4 years ago

lewebe commented 4 years ago

Hola, estoy tratando de enviar la imagen de una carta desde el servidor de la siguiente forma:

def enviar_carta(self, socket_cliente):
        # inserte código aqui

Pero al correrlo me da el error QPixmap: Must construct a QGuiApplication before a QPixmap. A qué se puede deber?

gatochico commented 4 years ago

Hola!

Si al enviar la carta quieres inmediatamente mandar un QPixmap desde el servidor, tendrías que reacomodar tu servidor como si fuera una aplicación de pyQt5 (similar a como hacemos todo el setup para una interfaz gráfica, solo que nunca le armas ventanas ni le aplicas show a nada, puesto que no tiene ventanas). Sino, te lanzará ese error ya que el programa te pide que corras una QApplication primero antes de instanciar Pixmaps, labels u otros widgets de pyqt5 :(

Por ende, tus dos opciones serían:

Espero se haya entendido!

lewebe commented 4 years ago

Hola @gatochico! Estaba pensando enviarla como un QPixmap porque pensé que era la única forma de hacerlo... A qué te refieres con "simplemente enviar la imagen desde el server"? Abrir la imagen como un archivo y leer los bytes? Gracias de antemano gato chico

gatochico commented 4 years ago

Exacto! Para enviar la imagen, tendrias que abrirla, leer sus bytes, enviar los bytes al cliente (con el protocolo pedido y todo). Luego tu cliente recibe los bytes y cuando ya recibió, decodifico todo y lo unió, tendrás un bytearray con la información de la foto en bytes.

Luego, teniendo este byteArray, puedes ir y cargarlo en un pixmap sin la necesidad de almacenarlo en un archivo en el cliente (pista: Investiga sobre el método loadFromData que tienen los pixmaps :speak_no_evil: .

Salu3

lewebe commented 4 years ago

Perfecto! Última cosa uwu. Ahora estoy intentando abrir el archivo de la siguiente manera:

with open(path_sprite_carta_reverso, 'rb') as archivo:
            carta = json.dump(archivo.read(),archivo)

Pero me tira el error TypeError: Object of type bytes is not JSON serializable. Si no hago el json.dump() y lo mando así nomas , no lo estaría usando en ninguna parte de mi tarea (ya que el resto de información que mando está en strings y solo necesito utilizar .encode(). Estaría bien eso?

gatochico commented 4 years ago

Para ese caso que indicas, no se debería usar json.dump, ya que dump se usa para transformar un objeto serializable a string. Ahí lo que tu quieres es abrir el archivo y sacar sus bytes, cosa que ya haces al abrirlo en 'rb'.

Ahora sobre si debes usar json dump/s en alguna parte de tu programa: Esto en realidad depende de tu propio programa, y principalmente, tu protocolo en envío de informacion entre sockets en general. Te recomiendo que leas la materia de serialización donde se abordan esas funciones, veas si los casos en que se usan aplican a tu tarea. Si consideras que no aplican y no hay casos donde deberías usar dump/s... entonces no fuerzes el usarlo.

Saludos!

lewebe commented 4 years ago

Perfecto, gracias @gatochico ! Sigo siendo tu fans