WxPython o PyQt, ¿cuál es la mejor biblioteca GUI de Python?
Python es un lenguaje de programación interpretado, orientado a objetos y de alto nivel con tipos de datos dinámicos. La biblioteca de gráficos GUI de Python permite a los programadores de Python crear fácilmente una interfaz de usuario GUI completa con teclas de función completas. Como desarrollador de Python, tarde o temprano utilizará una interfaz gráfica de usuario para desarrollar aplicaciones. wxPython y PyQt son los dos marcos GUI de Python más populares. ¿Cuáles son las diferencias entre ellos? p>
Apariencia
Según nuestra experiencia, lo primero a lo que la mayoría de los usuarios prestan atención cuando usan una aplicación debe ser la apariencia de la aplicación, así que primero comparemos la apariencia de wxPython y PyQt.
wxPython es un enlace del lenguaje Python para la popular biblioteca de herramientas GUI multiplataforma wxWidgets. Y wxWidgets está escrito en lenguaje C, por lo que cuando codifique el widget del botón en la GUI, no verá nada similar a otro sistema operativo.
▲Thunar y wxPython basados en Linux
PyQt también está escrito en C y está basado en el famoso kit de herramientas Qt. A diferencia de wxPython, no utiliza widgets nativos, sino que crea aproximaciones de widgets en función de lo que detecta del sistema operativo. Pero se puede decir que su aproximación es tan extrema que ni siquiera los estudiantes de arte pueden distinguirla del original.
Si usa KDE, puede usar otras bibliotecas PyKDE para cerrar la brecha entre PyQt original y la apariencia del escritorio Plasma en Linux y BSD, pero esto agrega nuevas dependencias.
▲KDE y Qt basados en Linux
Multiplataforma
wxPython y PyQt son compatibles con Linux, Windows y Mac, por lo que ambos son muy adecuados para aplicaciones cruzadas. -plataforma; sin embargo, esta multiplataforma no es incondicional. Debe realizar algunos ajustes si desea que su código Python se ejecute en una plataforma específica. Por ejemplo, el kit de herramientas GUI no puede ajustar el formato de ruta al directorio de datos. ejecútelo en las mejores prácticas de Python, use os.path.join y varios métodos de salida diferentes y más. La elección del conjunto de herramientas GUI no se abstrae mágicamente de la plataforma.
PyQt está trabajando arduamente para eliminar las diferencias entre plataformas y permitir los ajustes comunes requeridos por el propio Python. PyQt puede evitar la mayoría de los problemas multiplataforma, por lo que el código GUI básicamente puede seguir siendo el mismo en diferentes sistemas operativos.
En wxPython, es posible que los usuarios necesiten realizar algunos ajustes en el código GUI en diferentes plataformas según el contenido de programación. Por ejemplo, para evitar que ciertos elementos parpadeen en Microsoft Windows, la propiedad USE_BUFFERED_DC debe establecerse en Verdadero para que los gráficos tengan doble búfer. Este no es el valor predeterminado, incluso si funciona incondicionalmente para todas las plataformas, por lo que puede ser un defecto en algunos casos de uso.
Instalación
Como desarrollador, es posible que no le importen los pasos de instalación necesarios para obtener las bibliotecas requeridas por su aplicación; sin embargo, si planea distribuir su aplicación, debe hacerlo; considere al usuario en orden El proceso de instalación que es necesario para ejecutar el programa.
Instalar Qt en todas las plataformas es tan sencillo como instalar cualquier otra aplicación, darle al usuario un enlace para descargar, luego instalar el paquete descargado y estará listo para usar.
PyQt se basa en el código C del propio Qt, lo que significa que los usuarios no sólo tienen que instalar PyQt, sino también todo Qt.
Esta operación no es tan simple como la instalación anterior, pero los equipos de Qt y PyQt han simplificado la operación de instalación tanto como sea posible. A partir de ahora, siempre que los usuarios puedan instalar navegadores o juegos, pueden instalar Qt con éxito a través del enlace. Si el usuario es muy bueno en eso, puede incluso usar el script de instalación como parte de su propio instalador.
En Linux, BSD e Ilumos, los instaladores generalmente los escribe el administrador de paquetes del revendedor para los usuarios.
El proceso de instalación de wxPython es muy sencillo en Linux y Windows, pero problemático en Mac OS. Mac OS no favorece la compatibilidad con versiones anteriores si los paquetes de software descargables están muy desactualizados. Dado que existe el código defectuoso para la solución, el paquete no se ha actualizado, por lo que las posibilidades de que los usuarios encuentren e implementen la solución por sí mismos son bajas. La solución ahora es empaquetar wxPython y distribuirlo a los usuarios de Mac OS, o confiar en un administrador de paquetes externo.
Widgets y funciones
Tanto PyQt como wxPython tienen todos los widgets comunes que los usuarios esperan de un conjunto de herramientas GUI, incluidos botones, casillas de verificación, menús desplegables, etc. Ambos admiten operaciones de arrastrar y soltar, interfaces con pestañas, cuadros de diálogo y la creación de widgets personalizados.
PyQt tiene la ventaja de la flexibilidad. Puede reorganizar, hacer flotar, cerrar y restaurar paneles Qt en tiempo de ejecución, proporcionando una interfaz centrada en la usabilidad altamente configurable para cada aplicación.
Siempre que utilices los widgets adecuados, podrás ofrecer muchas funciones fáciles de usar sin tener que repensar trucos sofisticados.
WxPython tiene muchas características buenas, pero no se puede comparar con PyQt en términos de flexibilidad y control del usuario. PyQt es más fácil de diseñar y diseñar para los desarrolladores. Antes de desarrollar Qt, se necesita algo de tiempo para aprender de los usuarios. Obtenga formas de realizar un seguimiento de los diseños personalizados o cómo encontrar paneles faltantes que se cerraron inesperadamente y más. Para wxPython, es difícil reabrir un panel que se cerró accidentalmente.
En general, después de todo, wxPython es solo una interfaz para wxWidgets, por lo que si realmente necesita una característica, puede implementarla en C y luego usarla en wxPython. En comparación con PyQt, wxPython tiene una curva de aprendizaje más pronunciada.
Comunicación
Las aplicaciones GUI se componen de muchos elementos visuales más pequeños, a menudo llamados "widgets". Para que una aplicación GUI se ejecute sin problemas, los widgets deben comunicarse entre sí; por ejemplo, el panel utilizado para mostrar imágenes sabe qué miniatura seleccionó el usuario. La mayoría de los kits de herramientas GUI, incluido wxPython, pueden manejar la comunicación interna con "devoluciones de llamada". Una devolución de llamada es un puntero a algún fragmento de código (una "función"). Si desea que suceda algo cuando se hace clic en un widget de botón, debe escribir una función para que se produzca la acción. Cuando se hace clic en el botón, la función se activa y se produce la acción.
Si lo combina con expresiones Lambda, producirá una solución muy flexible que puede superar sus expectativas.
Qt, por otro lado, es famoso por su mecanismo de señal/ranura. Si compara la red de comunicación interna de wxPython con un conmutador telefónico de la vieja escuela, la comunicación de PyQt puede considerarse como una red en malla.
▲Señales y ranuras en Qt
Qt usa señales y ranuras en lugar de funciones de devolución de llamada. Cuando ocurre un evento específico, se envía una señal. Los widgets de Qt tienen muchas señales predefinidas. Por supuesto, también podemos crear subclases de widgets para agregar las señales personalizadas que necesitemos. La ranura es retroalimentación sobre una señal específica. Los widgets de Qt también tienen muchas ranuras predefinidas, pero el enfoque común es crear una subclase del widget y agregar ranuras personalizadas para manejar las señales de interés.
El mecanismo de señal y ranura tiene seguridad de tipos: los parámetros de una señal deben coincidir con los parámetros de la ranura receptora. Debido a este mecanismo de coincidencia de parámetros, el compilador nos ayuda a verificar si hay discrepancias de tipos en las firmas. Las señales y las ranuras están débilmente acopladas: una clase que emite una señal no sabe ni le importa qué ranura recibe la señal. El mecanismo de señales y ranuras de Qt garantiza que si conecta una señal a una ranura, la ranura se llamará en el momento correcto con el argumento numérico. Las señales y las ranuras pueden transportar cualquier número de parámetros de cualquier tipo. Son completamente seguros.
Todas las clases que heredan de QObject o una de sus subclases (como QWidget) pueden usar números y ranuras. Los objetos se comunican de esta manera: el estado de un objeto cambia y envía una señal, y otro objeto al que le importa el cambio recibe la señal. El objeto que envía la señal no sabe ni está interesado en qué objeto recibe la señal que envía. Esta es una verdadera encapsulación de información, lo que garantiza que el objeto pueda usarse como un componente de software.
Las ranuras se pueden utilizar para recibir señales, pero por lo demás son funciones miembro ordinarias. La ranura no sabe si hay una señal conectada a ella, del mismo modo que el objeto no sabe si la señal que emite será recibida. Este mecanismo garantiza que Qt se pueda utilizar para crear componentes completamente independientes.
Las señales se pueden conectar a ranuras en conexiones de muchos a muchos. De esta manera, las señales y las ranuras establecen un poderoso mecanismo de programación de componentes.
Diseño
Al escribir una aplicación GUI, lo primero que debe hacer es diseñar el diseño para que todos los widgets estén distribuidos adecuadamente en la ventana de la aplicación. Al igual que al diseñar una página web, puedes cambiar el tamaño de la aplicación o incluso configurarla en un tamaño fijo.
En Qt, el diseño es muy fluido, los widgets tienen nombres claros (QPushButton, QDial, QCheckbox, QLabel, incluso QCalendarWidget) y son fáciles de llamar, e incluso la documentación de la aplicación está completa.
La mayor parte de la confusión aquí se centra en elementos GUI de nivel básico. Por ejemplo, si estuviera escribiendo una aplicación, ¿podría crear su ventana principal comenzando con QMainWindow o QWidget?
Un QWidget es un contenedor vacío que pueden usar todos los demás widgets y, por supuesto, mantenga más QWidgets múltiples para formar una ventana principal que contenga más widgets. QMainWindow usa QWidget y agrega muchas funciones convenientes que la mayoría de las aplicaciones necesitan, como una barra de herramientas en la parte superior, una barra de estado en la parte inferior, etc.
▲QMainWindow
Este es un pequeño editor de texto que utiliza QMainWindow, con solo más de 100 líneas de código Python:
wxEl widget básico en Python es wx. Ventana. Todo en wxPython se basa en la clase wx.Window, ya sea una ventana real o un botón, una casilla de verificación o una etiqueta de texto. Si el nombre de la clase está escrito incorrectamente, wx.Window simplemente lo ignorará.
La siguiente imagen utiliza wx.Frame para crear una ventana vacía:
Coloque otros widgets en la ventana wx.Frame y luego cree la aplicación GUI. Por ejemplo, el widget wx.Panel es similar a un div en HTML con restricciones de tamaño absoluto, por lo que puedes usarlo para crear paneles dentro de la ventana principal.
WxPython tiene menos funciones convenientes en comparación con PyQt. Por ejemplo, la funcionalidad de copiar y pegar está integrada en PyQt, mientras que en wxPython debe codificarse a mano (y está parcialmente limitada por la plataforma en la que se ejecuta).