Cette instructable décrit l’utilisation de variables dynamiques dans une fenêtre de PyQt.
QT permet la construction interactives, connectés windows (Ms/Linux/Android/IoS). Py QT permet tel bâtiment en Python. La boucle principale d’un scripts PyQt comprend les méthodes de la fenêtre, à l’aide des fenêtre-variables pré-définies. Mise à jour de ces variables de fenêtre, c’est possible, mais pas une bonne idée si une vaste transformation est nécessaire. Pour la fenêtre de ISS-tracker dans la première capture vidéo, filetage sert à fabriquer une fenêtre de PyQt à travailler avec les variables « extérieur ». Il y a sûrement des autres (et mieux les méthodes), mais celui-ci fonctionne très bien et sa structure « suits ma logique ».
Pour ces deux exemples, la disposition de fenêtre a été créée avec Qt Designer. Alors, s’il vous plaît ne pas tenir compte la quantité de lignes de code dans les deux scripts. Un lay-out de fenêtre pour un grand nombre de champs de mise en forme, nécessite le code déclaratif comme la position sur l’écran, la taille, comment il doit réagir sur max et minimiser la fenêtre, la couleur, le style, contenue, connectée l’action, etc.. Heureusement, Qt Designer génère toutes ces lignes de code basé sur votre mise en page graphique. Malheureusement à la suite de cela, vous vous retrouverez avec un grand nombre de lignes dans votre boucle principale.
Depuis j’ai voulu vous familiariser avec PyQt, I've construire la fenètre de ISS-tracker avec beaucoup de variables et différents types de champs. Pour ceux que cela intéresse, je vais élaborer un peu plus tard sur.
La seconde capture vidéo montre un script très petit et simple pour visualiser l’approche thread. Le script python utilisé se trouvent à: Bitbucket
Le scénario simule la levée d’un dé et traite le résultat des lancers.
Le script utilise deux threads : un thread pour le maintien de l’affichage de la fenêtre (PyQt exige que ce soit la boucle principale du script) et un autre thread de traitement et de déclencher périodiquement la fenêtre threads. Pour échanger des valeurs, les deux threads doivent être pointé vers les mêmes variables en mémoire. Dans des mots encore plus simples : un seul thread traite certaines données, place les résultats dans un endroit spécial, 'sonne à la porte"à la boucle principale de dire il est prêt et fait observer où la nouvelle livraison a été placée.
Donc, nous allons voir comment qui ressemble en Python :
Le script démarre avec l’importation habituelle des bibliothèques nécessaires: « QtCore » pour la création de threads, « QtGui » pour traiter les visuels de la fenêtre, « datetime » et « temps », donc il ne sera pas oublier à ce sujet.
Les deux prochaines déclarations « essayer » sont nécessaires pour le maquillage des zones de l’écran. Ne me dérange pas ces: Qt Designer génère ces lignes dès que vous commencez à utiliser des descripteurs de RTF. (par exemple pour afficher une autre police, couleur, taille, gras/italique, etc. de n’importe quel champ dans la fenêtre, il faut définir un descripteur de texte riche (HTML, par exemple).)
Puis quelques variables globales: « jeter numéro » et « total de tous les lancers » la variable essentielle est la mémoire partagée entre les deux fils, dont j’ai nommé le « stockage reliant » (vieilles habitudes...).
Le stockage reliant ici est une chaîne lorsque toutes les variables doivent être mis en par le thread de traitement et ceux peuvent être lu par la fenêtre-thread.
Un autre de mes anciennes habitudes est un bienfait pour l’utilisation de chaînes. J’ai appris comment cela peut sauver beaucoup de temps lors du débogage de scripts. (Et: Qt préfère les chaînes pour l’affichage.)
La méthode de thread (traitement) génère une valeur aléatoire (ne me dérange pas les manipuler ; J’ai juste essayé de forcer autant volatilité que possible à l’écran), calcule certaines autres valeurs et leur place dans la chaîne 'LinkingStorage'.
La classe « trigger » 'sonne la cloche"à la boucle principale. Il est appelé par Qthread et crée et émet un signal chaque dixième de seconde.
La classe se composent en majorité les définitions de mise en page écran qui servira dans la boucle principale. Bien que pas telle une vaste méthode comme dans le script de traqueur d’ISS, c’est toujours une partie substantielle du script. La méthode « setupUI » contient les déclarations pour les champs à afficher : type d’objet, position dans la fenêtre, la police, la relation à d’autres champs, etc.. Cette méthode est générée par Qt Designer. La méthode possède deux commandes. L’un pour appliquer les formats de champ ('retranslateUi') et l’autre à mettre en place la thread de traitement ('setupTrigger'). Ce dernier est ajouté au code généré. La méthode « setupTrigger » démarre le thread de traitement et définit la méthode à exécuter quand un signal est émis par le thread de traitement (i.e. "refreshWindow").
La méthode « refreshWindow » fractionne la chaîne « LinkingStorage », remplie par le thread de traitement et redéfinit les champs de la fenêtre Ajout de nouveau contenu. Un traitement mineur, comme l’obtention de l’heure actuelle, peut faire partie de la même méthode. Comme dit : principales de traitement, doit être exécuté dans le thread de traitement.
La boucle principale parle d’elle-même : construire une fenêtre et l’afficher sur l’écran.
À mon avis, il s’agit de la manière la plus simple pour ajouter des données dynamiques à une fenêtre.
L’écran de tracker ISS de construction
La source complète pour cette application se trouve à: Bitbucket
Bien que beaucoup plus grand en taille, manipuler la fenêtre et ses variables se fait dans la même manière :
- Déclaration de la fenêtre dans la classe « Ui_mainwindow »
- Déclaration de la thread de traitement dans la classe « déclencheur ». La minuterie pour émettre le signal sonore à la fenêtre-fil à 3 secondes. Ainsi que l’ensemble des temps de traitement de 2 secondes, cela se traduit par une actualisation de la fenêtre toutes les 5 secondes. Bien que je pense qu’il pourrait être attaché à une salopette 2 secondes, on devrait se rendre compte que les collecte pour les champs dynamiques de données se faites par des appels API. Si vous souhaitez utiliser le tracker pour un affichage constant, sachez que, à un taux de rafraîchissement de 2 secondes, le script va générer 43 200 appels en 24 heures. À mon avis c’est bien au-delà de « utilisation équitable » gratuite de l’API
- Les données passées par l’intermédiaire de la chaîne « LinkedStorage »
La manipulation de données est divisée en collecte des données statiques (seulement se sont réunis une fois et montré constamment) et le rassemblement de données dynamiques (local et ISS).
L’utilisation de plusieurs API pour obtenir toutes les données, a été décrite dans un ancien instructable sur le Raspberry Pi SenseHat :
Instructable