Este instructivo describe el uso de variables dinámicas en una ventana de PyQt.
QT permite construcción interactivos, conectados windows (Ms/Linux/Android/IoS). Py QT permite tal edificio en Python. El bucle principal de un scripts de PyQt consiste en los métodos de ventana, utilizando las variables de ventana predefinidas. Actualización de las variables de ventana es posible, pero no una buena idea si se necesita procesamiento extenso. Para la ventana de la ISS tracker en la primera captura video, threading se utiliza para hacer una ventana de PyQt trabajar con variables de "fuera". Seguro que hay otras (y mejores métodos), pero ésta funciona fino y su estructura 'se adapta a mi lógica'.
Para ambos ejemplos el diseño de la ventana fue creado con Qt Designer. Así, por favor, no la cantidad de líneas de código en dos secuencias de comandos. Formato de un lay-out de la ventana para una gran cantidad de campos, requiere código declarativo como la posición en la pantalla, el tamaño, cómo debe reaccionar en max/minimizar la ventana, color, estilo, acción contenida, conectada, etc.. Por suerte Qt Designer genera todas estas líneas de código basado en el diseño gráfico. Desafortunadamente como consecuencia de que terminarás con un montón de líneas en su bucle principal.
Puesto que quería familiarizarse con PyQt, he construir la ventana de la ISS tracker con un montón de variables y diferentes tipos de campos. Para aquellos que estén interesados, a elaborar un poco más más tarde en.
La segunda captura de vídeo muestra un script muy pequeño y simple para visualizar el enfoque de roscado. El script de python utilizado puede encontrarse en: Bitbucket
La escritura simula el lanzamiento de un dado y procesa los resultados de los tiros.
La secuencia de comandos utiliza dos hilos: un hilo de rosca para mantener la pantalla de la ventana (PyQt requiere que este sea el bucle principal de la secuencia de comandos) y otra para el proceso del hilo de rosca y activar periódicamente el hilo de la ventana. Para el intercambio de valores, ambos hilos deban ser apuntado hacia las mismas variables en memoria. En palabras simples aún más: un thread procesa algunos datos, coloca los resultados en una ubicación especial, 'suena el timbre de la puerta' en el bucle principal es listo y señala donde se ha colocado la nueva entrega.
Por lo tanto, vamos a ver lo que parece en Python:
La secuencia comienza con la importación habitual de las bibliotecas requeridas: 'QtCore' para la creación de los hilos de rosca, 'QtGui' para el procesamiento de los efectos visuales de la ventana, 'datetime' y 'tiempo' para no olvidarse de ella.
Las dos siguientes declaraciones 'try' son necesarios para la composición de los campos de la pantalla. No importa estos: Qt Designer genera estas líneas tan pronto como usted comience usando descriptores de texto enriquecido. (por ejemplo, para la visualización de otra fuente, color, tamaño, negrita/cursiva, etc de cualquier campo de la ventana, uno tiene que definir un descriptor de texto enriquecido (es decir, HTML).)
Entonces pocos variables globales: 'número de tiro' y 'total de los lanzamientos' la variable fundamental es la memoria compartida entre ambos hilos, que llamé 'guardar enlace' (viejos hábitos...).
El almacenamiento enlace aquí es una cadena donde todas las variables tienen que poner en el subproceso de procesamiento y donde los pueden leer en el subproceso de ventana.
Otro de mis viejos hábitos es un favor para el uso de cuerdas. Aprendí cómo esto puede ahorrar mucho tiempo durante la depuración de secuencias de comandos. (Y: Qt prefiere cadenas por pantalla.)
El método de rosca (procesamiento) genera un valor aleatorio (no importa la manipulación; Acabo de probar a fuerza de tanta volatilidad como sea posible en la pantalla), calcula algunos otros valores y pone en la cadena 'LinkingStorage'.
La clase de 'trigger' 'suena la campana' en el bucle principal. Se llama Qthread y crea y emite una señal cada décima de segundo.
La siguiente clase consiste en la mayoría de las definiciones de diseño de la pantalla para ser utilizado por el bucle principal. Aunque no tan un extenso método como en la secuencia de comandos ISS tracker, es todavía una parte substancial de la escritura. El método 'setupUI' contiene las declaraciones para los campos que se muestra: tipo de objeto, posición en la ventana, fuentes, relación con otros campos, etc.. Este método se genera por Qt Designer. El método tiene dos comandos. Uno para aplicar los formatos de campo ('retranslateUi') y uno para configurar el procesamiento de hilo ('setupTrigger'). Este último se añade el código generado. El método 'setupTrigger' inicia el subproceso de procesamiento y define el método a ser ejecutado cuando se emite una señal por el hilo de procesamiento (es decir, ' refreshWindow').
El método 'refreshWindow' divide la cadena 'LinkingStorage', por el hilo de procesamiento y redefine los campos de la ventana Agregar nuevo contenido. Procesamiento menor, como obtener la hora actual, puede ser parte del mismo método. Como dijo: mayor procesamiento, debe ejecutarse en el subproceso de procesamiento.
El bucle principal habla por sí mismo: construir una ventana y mostrar en la pantalla.
En mi opinión esta es la forma más sencilla para agregar datos dinámicos a una ventana.
Construcción de la pantalla de seguimiento de la ISS
La fuente completa para esta aplicación se puede encontrar en: Bitbucket
Aunque mucho más grande en tamaño, manejo de la ventana y sus variables se hace igual:
- Declaración de la ventana de la clase 'Ui_mainwindow'
- Declaración del hilo de procesamiento en la clase de 'trigger'. El temporizador para emitir la señal para el subproceso de ventana se establece en 3 segundos. Junto con el general tiempo de procesamiento de 2 segundos, esto se traduce en una actualización de la ventana cada 5 segundos. Aunque creo que podría sujetarse a un general 2 segundos, uno debe darse cuenta que los datos de los campos dinámicos realiza llamadas a la API. Si desea usar el rastreador para una exhibición constante, ten en cuenta que en una tasa de refresco de 2 segundos el script generará 43.200 llamadas en 24 horas. En mi opinión, que está más allá de 'uso justo' gratis de API
- Los datos pasan a través de la cadena 'LinkedStorage'
El manejo de datos se divide en la recolección de los datos estáticos (sólo se reunieron una vez y se muestra constantemente) y la recopilación de datos dinámicos (local y ISS).
El uso de varias API para obtener todos los datos, se ha descrito en un antiguo instructable sobre la frambuesa Pi SenseHat:
Instructable