¿Qué biblioteca GUI de Python es la mejor, wxPython o PyQt?
Externo
Según nuestra experiencia, la mayoría de los usuarios primero deben prestar atención a la apariencia de la aplicación cuando la usan, así que primero comparemos la apariencia de wxPython y PyQt.
WxPython es un enlace del lenguaje Python y la popular biblioteca de herramientas GUI multiplataforma wxWidgets. WxWidgets está escrito en C++, por lo que cuando codifica un widget de botón en una GUI, no verá nada parecido 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 nativo.
Widget, pero crea una aproximación del widget en función del sistema operativo que detecta. Pero se puede decir que su aproximación es extrema, e incluso los estudiantes de arte no pueden notar la diferencia entre ella y la obra original.
Si usa KDE, puede usar otras bibliotecas PyKDE para cerrar la brecha entre la apariencia del escritorio original PyQt y Plasma entre 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 son muy adecuados para aplicaciones cruzadas. plataforma. Pero esta multiplataforma no es incondicional. Si desea que su código Python se ejecute en una plataforma específica, es necesario realizar algunos ajustes. Por ejemplo, el kit de herramientas GUI no puede ajustar el formato de ruta del directorio de datos, por lo que debe ejecutar las mejores prácticas en Python, utilizando os.path.join y varios métodos de salida diferentes. La elección del conjunto de herramientas GUI no se abstrae mágicamente de la plataforma.
PyQt intenta eliminar las diferencias entre plataformas y permitir 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 permanecer sin cambios en diferentes sistemas operativos.
En wxPython, es posible que los usuarios necesiten realizar algunos ajustes en el código GUI para 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 True para que los gráficos tengan doble búfer. Este no es el valor predeterminado, aunque todas las plataformas pueden ejecutarse incondicionalmente, por lo que puede tener fallas en algunos casos de uso.
Solucionado
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 se debe realizar para que el programa se ejecute.
Instalar Qt en todas las plataformas es tan fácil como instalar cualquier otra aplicación. Proporcione al usuario un enlace de descarga y luego instale el paquete de software descargado para su uso.
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 hecho que la operación de instalación sea lo más simple posible. Ahora, siempre que el usuario pueda instalar el navegador o el juego, Qt se podrá instalar correctamente a través del enlace. Si eres muy bueno en eso, puedes incluso hacer que el script de instalación forme parte de tu propio instalador.
En Linux, BSD e Ilumos, los instaladores generalmente los escribe el administrador de paquetes del revendedor para los usuarios.
En Linux y Windows, el proceso de instalación de wxPython es muy sencillo, pero existen problemas en Mac OS.
Mac OS no favorece la compatibilidad con versiones anteriores si los paquetes de software descargables están muy desactualizados. Debido al código defectuoso de este parche, el paquete aún no se ha actualizado, por lo que las posibilidades de que los usuarios encuentren e implementen el parche por sí mismos son muy bajas. La solución actual es empaquetar wxPython para distribuirlo a usuarios de Mac OS o confiar en un administrador de paquetes externo.
Componentes y funciones
PyQt y 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 interfaces con pestañas, cuadros de diálogo y la creación de widgets personalizados.
La ventaja de PyQt es 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.
Con los widgets adecuados, puedes ofrecer a tus usuarios muchas funciones fáciles de usar sin tener que reconsiderar sus habilidades sofisticadas.
WxPython tiene muchas características buenas, pero no se puede comparar con PyQt en términos de flexibilidad y control del usuario. PyQt facilita a los desarrolladores el diseño y el diseño. Antes de desarrollar Qt, tomó algún tiempo aprender de los usuarios cómo rastrear un diseño personalizado o cómo encontrar un panel faltante que se cerró accidentalmente. Con wxPython, es difícil reabrir un panel que se cerró accidentalmente.
En términos generales, wxPython es solo la interfaz de wxWidgets, por lo que si realmente necesita una función, puede implementarla en C++ y luego usarla en wxPython. La curva de aprendizaje de wxPython es más pronunciada en comparación con PyQt.
Comunicación
Una aplicación GUI se compone de muchos elementos visuales más pequeños, a menudo llamados "widgets". Para que una aplicación GUI funcione sin problemas, los widgets deben comunicarse entre sí. Por ejemplo, un panel utilizado para mostrar imágenes puede saber qué miniatura seleccionó el usuario. La mayoría de los kits de herramientas GUI, incluido wxPython, pueden usar "devoluciones de llamada" para manejar la comunicación interna. Una devolución de llamada es un puntero a un fragmento de código (una "función"). Si algo sucede cuando haces clic en un widget de botón, debes escribir una función para lo que sucede. Cuando se hace clic en el botón, se activa la función y se produce la acción.
Si se combina con expresiones Lambda, producirá una solución muy flexible y el efecto puede superar sus expectativas.
Qt, por otro lado, es famoso por su mecanismo de señales/ranuras. Si se compara la red de comunicación interna de wxPython con un conmutador telefónico antiguo, entonces la comunicación de PyQt puede considerarse como una red de malla.
▲Señales y ranuras en Qt
Qt usa señales y ranuras en lugar de funciones de devolución de llamada. Las señales se emiten cuando ocurre un evento específico. Los widgets de Qt tienen muchas señales predefinidas. Por supuesto, también podemos crear una subclase de widget para agregar las señales personalizadas que necesitemos. La ranura es retroalimentación a 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 es de tipo seguro: los parámetros de la señal deben coincidir con los parámetros de la ranura receptora. Gracias a este mecanismo de coincidencia de parámetros, el compilador puede ayudarnos a verificar las firmas en busca de discrepancias de tipos. Las señales y las ranuras están débilmente acopladas: la clase de 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. La comunicación entre objetos es así. Cuando el estado de un objeto cambia, se envía una señal y otro objeto que se preocupa por el cambio recibe la señal. El objeto que envía la señal no sabe o no le interesa qué objetos reciben la señal que envía. Se trata de una verdadera encapsulación de información, que garantiza que los objetos puedan utilizarse como componentes de software.
Las ranuras se pueden utilizar para recibir señales, pero también son funciones miembro ordinarias. Una ranura no sabe si hay una señal conectada a ella, al igual que un objeto no sabe si recibirá una señal que emite.
Este mecanismo garantiza que Qt se pueda utilizar para crear componentes completamente independientes.
Las señales se pueden conectar a las ranuras de forma de muchos a muchos. De esta manera, las señales y las ranuras crean un poderoso mecanismo de programación de componentes.
Diseño general
Para escribir una aplicación GUI, lo primero que debe hacer es diseñar el diseño para que todos los widgets se muestren correctamente 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 e incluso QCalendarWidget), son fáciles de llamar e incluso la documentación de la aplicación está completa.
Gran parte de la confusión aquí se centra en los elementos básicos de la GUI. Por ejemplo, si está escribiendo una aplicación, ¿puede crear su ventana principal desde QMainWindow o QWidget?
QWidget es un contenedor vacío que pueden utilizar todos los demás widgets. Por supuesto, se pueden colocar más QWidgets para formar una ventana principal para más widgets. QMainWindow usa QWidget, que agrega muchas funciones convenientes que requieren la mayoría de las aplicaciones, como la barra de herramientas en la parte superior y la barra de estado en la parte inferior.
▲QMainWindow
Este es un pequeño editor de texto que usa QMainWindow, con solo 100 líneas de código Python:
wxEl widget básico en Python es wx. Todo en wxPython está basado en wx. La clase de ventana, 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á mal escrito, wx. La ventana simplemente lo ignorará.
La siguiente imagen muestra una ventana vacía creada con wx. Marco:
Pon otros widgets en wx. Enmarque la ventana y luego cree una aplicación GUI. Como por ejemplo wx. El widget Panel es similar a un div en HTML, con un límite de tamaño absoluto, por lo que puedes usarlo para crear paneles dentro de la ventana principal.
En comparación con PyQt, WxPython tiene menos funciones convenientes. Por ejemplo, PyQt tiene una función incorporada de copiar y pegar, pero debe codificarse manualmente en wxPython (y algunas están limitadas por la plataforma en la que se ejecuta).