- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personlive_helpToutes les questions
Jean-Marc
5 mars 2023 - 05 mars 2023 à 11:52
checkConversation résolue
2 réponses
Bonjour,Je viens de travailler à partir du cours "Créer une deuxième fenêtre".Je me demande comment passer d'une fenêtre principale à une autre fenêtre principale (en effaçant l'ancienne). Par exemple sur …
00:00:00 :Quand on crée des applications, on a envie de faire une application qui dispose de plusieurs fenêtres.Pour ce faire, vous allez voir qu'il y a une petite subtilité qu'on va voir dans cette vidéo.
00:00:10 :Si vous avez déjà essayé de créer plusieurs fenêtres dans une application Qt,vous êtes peut-être déjà tombé dans cette erreur qu'on va voir ensemble.Là, j'ai une application très basique avec juste une fenêtre et un bouton au milieu.
00:00:23 :Et ce que je veux faire, c'est, quand je clique sur le bouton ici, ouvrir plusieurs nouvelles fenêtres.Pour l'instant, j'ai juste une méthode ici qui est connectée au signal clic de mon bouton.
00:00:33 :A l'intérieur de cette méthode, je vais vouloir créer un nouveau QWidget et l'afficher.Vous avez probablement fait une variable. Vous avez créé un nouveau QWidget.
00:00:43 :On va lui donner un titre pour qu'on puisse la repérer.On va faire un setWindowTitle et je vais faire un string avec, ici, j'ai importé depuis le module random,la fonction ranRange qui va me permettre de faire un nombre aléatoire.
00:00:56 :On va mettre un numéro et on va insérer ici un nombre aléatoire, par exemple, entre 0 et 999.On fait un window.setTitle et ensuite on fait un window.show pour afficher la fenêtre que l'on vient de créer.
00:01:11 :C'est à peu près la même chose que ce qu'on a fait ici.Quand on a une QApplication, on crée une instance de notre MainWindow qui, dans ce cas-ci, est également un QWidget.
00:01:19 :Et ensuite, on l'appelle.Si je lance le script et que je clique sur le bouton, vous voyez que rien ne se passe.Il se peut, si vous avez un ordinateur un petit peu lent, que vous voyez quelque chose qui flashe,que vous voyez une fenêtre qui s'ouvre et qui se referme très rapidement.
00:01:33 :Dans mon cas, je ne la vois même pas.Et si je regarde mes applications, vous voyez que je n'ai aucune autre fenêtre que celle-ci actuellement.
00:01:40 :Qu'est-ce qui se passe ici ?Le problème, c'est le problème du garbage collector.Puisque Python, quand il arrive à la fin d'une fonction, il va détruire les variables qui sont dans cette fonction.
00:01:51 :La variable window qu'on a créée ici, l'instance de notre QWidget, n'est valable qu'à l'intérieur de cette méthode.Et tout ce qu'on a créé à l'intérieur de cette méthode va être supprimé par Python quand on arrive à la fin de cette méthode.
00:02:05 :C'est pour ça qu'on crée une fenêtre, qu'on l'affiche et qu'ensuite Python va la détruire.Comment faire pour ne pas la détruire ?C'est très simple, on va la préfixer de self.
00:02:15 :Puisque quand on la préfixe de self, on va faire cette fois-ci un attribut de notre instance,donc de notre instance window qui est ici dans l'espace global de mon application.
00:02:24 :Donc en faisant ceci, la fenêtre ne sera pas récupérée et détruite par le garbage collector.Puisque quand je vais lancer mon application, tant que mon script va rouler, cette variable ici, cette instance, elle va exister.
00:02:37 :C'est juste quand je vais fermer le script que tout ça n'existera plus.Mais tout ce qui est dans l'espace global, tant que le script roule, ça va rester dans l'espace global et ça ne sera pas détruit par le garbage collector.
00:02:46 :Donc quand je fais self.window, c'est comme si j'avais un attribut window sur mon instance ici.Et donc même quand j'arrive à la fin de cette méthode, cet attribut self.window ne sera pas détruit.
00:03:05 :Alors maintenant le problème que j'ai c'est que si j'essaye de recréer une nouvelle fenêtre, là on a la fenêtre numéro 735,je clique une nouvelle fois et là j'ai une nouvelle fenêtre qui s'ouvre mais elle a détruit l'ancienne.
00:03:16 :Donc je vais voir ici, j'ai bien effectivement Visual Studio Code ici, ma fenêtre principale et la fenêtre cette fois 896.Donc qu'est-ce qui s'est passé ici ? Et bien de la même façon, c'est un problème de variable.
00:03:27 :Là on a une variable qui s'appelle self.window qui nous permet de créer une fenêtre.Sauf que quand on clique de nouveau sur le bouton, on va écraser ce qu'on avait auparavant.
00:03:36 :On va créer une nouvelle variable sur cette variable window et on va écraser la fenêtre et en recréer une nouvelle.Alors qu'est-ce qu'on peut faire dans ce cas-ci ? On pourrait par exemple faire un dictionnaire qui va stocker nos différentes fenêtres.
00:03:47 :Donc je vais faire un dictionnaire ici dans la méthode init qui va s'appeler windows.Et plutôt que de créer une variable comme ceci, ce que je vais faire c'est que je vais faire self.windows
00:03:58 :et on va créer une nouvelle clé dans ce dictionnaire.On va l'appeler par exemple window et on va reprendre notre numéro aléatoire.Donc je vais le sortir ici du fstring, je vais l'appeler par exemple window number.
00:04:12 :Donc on va créer notre nombre aléatoire ici et on va l'insérer ici et ici.Donc ce qu'on fait là c'est qu'on va rajouter une clé dans notre dictionnaire.
00:04:25 :Donc on rajoute une clé qui s'appelle window et le numéro de la fenêtre.On dit que c'est égal à notre QWidget et comme ça on va pouvoir donc réutiliser cette clé ici à la place de la variable que j'avaiset là de même pour l'afficher.
00:04:37 :Et si jamais on voulait récupérer nos différentes fenêtres pour faire différentes opérations par la suite,et bien on pourrait les récupérer grâce à ce dictionnaire en allant les cibler avec leur nom.
00:04:47 :Donc là j'ai cette window title fenêtre.Donc là on a un nombre aléatoire mais on peut imaginer par exemple qu'on ait une fenêtre pour les paramètres,une fenêtre pour rajouter quelque chose et donc là on aurait quelque chose de plus explicite.
00:04:59 :On aurait par exemple settings et donc quelque part ailleurs dans mon script si j'avais ici show settings,je pourrais donc récupérer cette fenêtre depuis mon dictionnaire en faisant settings comme ceci.
00:05:09 :Donc là comme on a un nombre aléatoire forcément c'est un peu plus compliqué puisqu'on ne peut pas forcément deviner le nommais c'est vraiment juste pour l'exemple pour vous montrer qu'on peut créer autant de fenêtres que l'on veut.
00:05:18 :Donc là en les stockant dans le dictionnaire cette fois-ci on aura différentes clés à chaque fenêtre qui est crééeet donc on ne va pas écraser la variable que l'on avait et la fenêtre ne sera donc pas fermée à chaque fois.
00:05:28 :Donc je relance mon script, je clique sur new window, j'ai bien une fenêtre qui s'ouvre avec 899et là si je clique une nouvelle fois j'ai une autre fenêtre qui s'ouvre 629, une autre etc etc.
00:05:39 :Donc là je peux créer autant de fenêtres que je veux et les fermer et quand je vais fermer la dernière fenêtre iciet bien ça va fermer en application et vous voyez ici que je reviens dans mon terminal,au niveau du terminal et que mon script a été arrêté.
00:05:52 :Donc voilà comment faire pour créer des fenêtres, pour s'assurer qu'elles restent.Donc c'est vraiment des concepts de Python, c'est le garbage collector, c'est pas du concept de Qt,c'est vraiment des problèmes qui rentrent en cause avec Python qui va supprimer nos variablesou qui va écraser la variable que l'on avait, en fait en créer une nouvelle,
00:06:07 :mais ça a le même effet que de supprimer donc la fenêtre que l'on avait et de ne pas la garder.Donc ça c'est une des façons de faire, de passer par un dictionnaire pour garder en mémoire nos fenêtreset donc comme je vous disais là c'est un exemple très théorique avec ce nombre aléatoire
00:06:20 :mais si on voulait créer deux ou trois fenêtres et bien on pourrait directement ici les créeren faisant par exemple createPreferenceWindowet on pourrait même ne pas passer par un dictionnaire et directement faire des variables différentes.
00:06:31 :On pourrait faire preferenceWindow comme ceci et ensuite l'afficher,donc là on va enlever le setWindowTitle, preferenceWindow on va faire un showet là je pourrais faire un autre createUserWindow par exempleet de la même façon donc copier tout ça et faire une autre variable.
00:06:48 :Donc ça ce serait possible aussi, on n'est pas obligé de passer par un dictionnaire,c'était vraiment pour vous montrer une façon de faire qui permet de générer des fenêtres à la voléeet de quand même y avoir accès, mais on pourrait également comme ça faire des variables séparéeset ça fonctionnerait de la même façon.
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.