Como hacer una aplicación multiplataforma y no morir en el intento

Hi folks,

estoy tratando de hacer un programa para poder configurar módulos Bluetooth HC-06, HC-05 y similares, con una interfaz gráfica, desde el ordenador, a través de un Arduino controlado por el USB. In other words, una GUI para mandarle comandos AT a los módulos. Quiero que sea lo más sencillo para el usuario:

  • Que se instale con un .exe (Windows), .dmg (Mac) o un .deb / .rpm Linux), y se instalen sus dependencias tambien.
  • Se le pueda poner un icono en el escritorio y se abra con un click (esto en Linux ya lo olvidamos).

Bueno, aquí empieza lo divertido…

Lenguaje

  • La voy a desarrollar en Python 3 (de hecho me planteo Python 3.6 en adelante), así que digo “bueno, la gui la haré con Tkinter, que aunque quede un poco más feucha, con que se tenga Python instalado en el sistema, es suficiente”.
  • Existe la posibilidad de utilizar Kivy (que me gusta más), pero es un framework mucho más pesado (aunque me permite portarlo a dispositivos táctiles). El mayor inconveniente es que su instalación es un dolor de gonadas.
  • No barajo la opción ni de PyQt, ni Qt, ni Electron ahora mismo.

Programar el Arduino

  • La aplicación tiene que programar el Arduino sin que el usuario lo sepa, o sin que haga falta que el usuario cargue el sketch mejor dicho.
  • Tengo que poder programar el Arduino desde un script de Python (no hablo de Firmata ni nada de eso). Es decir, que usando por ejemplo el módulo subprocess o sys, mando la orden de cargar el sketch.
  • Lo que no sé, es si descargar yo las libre rías de Arduino a pelo, o pedirle al usuario que tenga Arduino instalado en su sistema.
  • Si opto por la segunda opción para no complicarme la vida, tendría que buscar en el sistema donde están los archivos de Arduino para no molestar al usuario (a parte de que ponga la opción de que él introduzca el path de Arduino por si quiere usar otro).
  • Para ahorrarme todo esto, podría tirar de Platformio (que me encanta y es superflexible), pero está hecho en Python 2 (ya que tira de Scons), así que aunque mande ejecutar un comando en Python 2, tendría que hacer que se instalase Platformio en el sistema.

Empaquetado

  • No tengo ni papa de como empaquetar la app, para que lleve todo junto.
  • No se si es buena idea llevar todo junto a cholón, rollo Flatpak / AppImage, o hacer un contenedor Docker que se ejecute con un click y lleve todas las dependencias dentro…
  • Además tendría que ver como se pasa luego todo eso a .exe, .dmg, .deb, etc…
  • Me estaba planteando usar el mencionado Scons para llevar el control de todo esto, pero al estar hecho en Python 2, me echa para atrás.

Así que acudo aquí al consejo de sabios a ver como le puedo meter mano a esto.

PD: Recuerdo que se va a hacer en Python y de esta manera porque es lo que me motiva a mi. Ahorraros comentarios del tipo “¿por que haces eso si ya existe esto otro? o ¿por que no lo haces en la tecnología tal mejor?” Me apetece hacerlo así y listo, el que quiera es libre de hacer su versión, así que hakuna matata, vive y deja vivir

[Parafandilia de por qué no me gusta python]

Y si mis argumentos no te valen, te dejo otros comentarios:

  • Programar el arduino conlleva tener instalado los drivers. Esto puede dar más de un quebradero de cabeza, sobretodo en los chinorros con CH340. Mi recomendación: Obliga al usuario a instalar platformio y ejecútalo «como comando», no llamando a la API ni nada, sino como un programa cualquiera (olvida que es python). Al usar platformio, simplemente defines las bibliotecas al usar y que se las descargue el sistema, el usuario solo tendría que elegir la placa a lo sumo.

  • Para empaquetar la app, seguramente un snap/flatpak/appimage sea lo mejor. Docker no tiene sentido. No pienses en docker como «una forma de distribuir una app», es una forma de «distribuir servicios». Dar un docker sería casi como darle una máquina virtual entera. Y por otro lado, cargar una gui mediante docker es bastante jaleo.

  • Desconozco como empaquetar para los otros SOs, pero supongo que no será muy complejo, aunque seguramente acabe siendo 10KBs de app y 20MBs de python.

1 me gusta

Este tema se cerró automáticamente 20 días después del último post. No se permiten nuevas respuestas.