- 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 person00:00:00 :On va remplacer cette ligne de code dans laquelle on ajoute tout simplement pour l'instant le chemindu fichier dans notre List2Jet par une méthode un petit peu plus complexe qui va déjà permettre devérifier que le chemin de l'image n'est pas déjà dans la liste, donc pour éviter d'ajouter des
00:00:15 :doublons, et ensuite d'ajouter un List2JetItem qui va avoir l'icône, donc l'icône de la petite croixrouge pour nous indiquer que l'image n'est pas encore convertie. Donc on va aller plus loin
00:00:25 :ici et on va en fait sélectionner toutes ces lignes de code et je vais aller faire un refactoring.Je vais cliquer sur refactor et je vais cliquer sur refactor this ici et on va sélectionner méthode,donc on va en fait extraire cette ligne de code dans une méthode, donc je clique dessus et on va
00:00:41 :mettre le nom de la méthode. Donc la méthode je vais l'appeler tout simplement addFile et vousvoyez ici que automatiquement il détecte qu'on va avoir besoin en fait d'un paramètre, donc il mepropose ici un paramètre qui par défaut est appelé url, moi je vais l'appeler plutôt pat, puisque
00:00:56 :url ça fait un peu référence au web, donc je préfère mettre pat même si ici on a un nom devariable qui s'appelle url, dans ma méthode je vais l'appeler pat. Donc je mets ça ici et
00:01:06 :automatiquement vous voyez qu'on a un petit aperçu de ce à quoi ça va ressembler, donc on va avoirici une méthode qui va s'appeler addFile qui va avoir self bien entendu et qui va avoir un paramètrepat. Donc je vais appuyer sur ok et automatiquement vous voyez qu'on a fait un refactoring, donc
00:01:20 :PyCharm se charge de tout, il va nous mettre automatiquement le nom de la méthode ici, il val'appeler et il va passer url ici dans notre pat et il a mis automatiquement la ligne de code quiétait donc auparavant dans le dropEvent dans ma nouvelle méthode addFile. Donc ça c'est très
00:01:34 :pratique, je voulais vous montrer le refactoring et la puissance de PyCharm qui nous permetcomme ça d'extraire du code et de le mettre à l'intérieur par exemple dans ce cas-ci d'uneméthode, donc c'est vraiment très pratique. Là par contre on va pas laisser cette ligne de code, à la
00:01:47 :place on va mettre donc la vérification pour les doublons et l'ajout du ListWidgetItem avecson icône. Donc la première chose qu'on va faire c'est récupérer tous les éléments qui sont déjà
00:01:57 :présents dans notre ListWidget pour avoir en fait une liste de toutes les images qui sontdéjà dans le ListWidget, comme ça on va pouvoir vérifier si l'image qu'on ajoute, donc si lechemin de l'image qu'on ajoute n'est pas déjà présent dans la liste et s'il n'est pas présentet bien on va l'ajouter, donc c'est comme ça qu'on va gérer les doublons. Donc ce que je vais faire,
00:02:15 :alors accrochez-vous, je vais le faire avec une compréhension de liste puisque en fait c'estassez long, il y a pas mal de choses à faire et donc ça ferait une grosse boucle si on le faisaità l'intérieur d'une boucle normale, donc moi je vais le faire à l'intérieur d'une compréhension
00:02:27 :de liste. Donc c'est un peu alambiqué, en fait ce que je veux faire c'est tout simplement récupérerle texte de toutes les entrées qui sont dans mon ListWidget, donc pour ça ce que je vais fairec'est déjà faire self.listwidgetfiles.count, ça ce que ça va faire c'est que ça va me retourner
00:02:42 :le nombre d'éléments qui sont à l'intérieur de mon ListWidget, donc si j'ai par exemple troisimages qui sont dans mon ListWidget, ça va me retourner 3. Donc ça, ça va me permettre de faire
00:02:52 :une boucle, alors je vais faire comme je vous disais une compréhension de liste, donc je vaismettre tout ça entre crochets et on va dire pour l'instant pour index in range de tout ça. Donc là
00:03:03 :imaginez qu'on ait trois entrées dans mon ListWidget, là on aurait le nombre 3, donc c'estcomme si je mettais 3 ici, range de 3 ça me retourne quoi, ça me retourne une liste, donc une liste quiva contenir les éléments 0, 1 et 2, et on va tout simplement faire une boucle donc pour index in 0,
00:03:18 :1 et 2. Donc pour l'instant on fait juste ça, donc on va avoir une boucle qui va boucler et indexva être égal à 0, à 1 et à 2. Donc je remets le code comme il était avant, voilà pour que ce
00:03:27 :soit procédural, donc range de self ListWidgetFiles.count, donc si on a 3 éléments dans maliste on aura 3, si on en a 5 on aura 5, et on va faire un range sur le nombre d'éléments. Ensuite
00:03:38 :ce qu'on va faire c'est qu'on va récupérer les éléments, donc les ListWidgetItem qui sontcontenus dans la liste. Pour récupérer un item à partir de l'index, il faut passer par notre
00:03:47 :ListWidget, donc on va faire self.ListWidgetFiles et on va pouvoir récupérer un item avec laméthode item. Donc par exemple si je mets 0 ici, on va récupérer le premier item dans notre liste,
00:03:57 :on va récupérer le deuxième item, etc. Donc là plutôt que de mettre 0, 1, 2, etc. vous vousdoutez bien qu'on va mettre à la place index, donc je prends tout ça et je le mets ici juste avant laboucle for. Donc on va dire en fait dans ce cas-ci qu'on récupère le ListWidgetItem qui correspond
00:04:12 :à index pour chaque index dans ma liste, donc là dans ma liste qui va être 0, 1, 2, 3 par exemplesi on a 4 éléments, etc. Et ensuite nous ce qu'on veut c'est pas l'item directement mais le texte
00:04:24 :de l'item puisque nous on veut le chemin complet vers l'image. Si on laisse juste ça pour l'instanton va avoir une liste de ListWidgetItem. Nous ce qu'on veut c'est le texte des ListWidgetItem.
00:04:33 :Donc après tout ça, il me suffit de rajouter .text, donc la méthode texte qui me permet derécupérer le texte associé à un ListWidgetItem. Donc vous voyez c'est un peu compliqué, il n'y a
00:04:44 :pas vraiment d'autre façon de faire de passer comme ça par le self.ListWidget.Count, il fautpasser par une méthode un peu détournée comme ça en allant récupérer ensuite l'index et doncrécupérer le ListWidgetItem et récupérer le texte de ce ListWidgetItem. Donc vraiment repasser là
00:05:00 :dessus si vous n'avez pas compris. Aussi vous pouvez transformer ça en boucle normale et nonpas le faire à l'intérieur d'une compréhension de liste si c'est plus simple pour vous. Moi je
00:05:08 :trouve que voilà de le faire sur une ligne comme ça une fois que vous avez compris ce qui se passec'est pas si compliqué. Donc tout ça je vais le récupérer dans une variable que je vais appeler
00:05:15 :tout simplement items par exemple. Alors je vais juste minimiser ça là encore pour qu'on y voitquelque chose. Donc je récupère tout ça à l'intérieur d'une variable items et donc on va
00:05:24 :pouvoir vérifier par la suite si le chemin qu'on envoie donc path ici se retrouve ou non àl'intérieur de cette liste. Donc si le chemin est déjà à l'intérieur de la liste ça veut dire qu'on
00:05:34 :ne va pas l'ajouter puisqu'il est déjà dans la liste et s'il n'est pas dans la liste et bien onva l'ajouter. Donc ce qu'on va faire c'est tout simplement une structure conditionnelle. On va
00:05:42 :dire if path not in items tout simplement. Et alors là vous voyez qu'il a envoyé en faitdirectement url mais url ça va être un queue url. Nous ce qu'on veut c'est le chemin complet et si
00:05:54 :vous vous souvenez bien pour avoir le chemin complet à partir du queue url il faut mettreto local file comme ceci. Donc la méthode to local file qui me permet de récupérer le chemin
00:06:02 :complet. Donc on va passer tout ça à notre paramètre path. Je vais l'indiquer ici moij'aime bien mettre le nom des paramètres comme ça c'est clair vraiment où on l'envoie. Donc
00:06:11 :on envoie url to local file à notre paramètre path qu'on va récupérer donc ici dans notreméthode add file. On va vérifier donc si ce chemin donc si le chemin vers le fichier de l'image est
00:06:22 :contenu ou pas dans ma liste widget. Donc si ce n'est pas dans le liste widget donc là ce qu'onvérifie avec le not in donc là il faut vraiment le lire presque en français. Si le chemin n'est
00:06:31 :pas dans items donc s'il n'est pas dans mon liste widget et bien on va l'ajouter. Donc ce qu'on vafaire c'est qu'on va créer un liste widget item. Donc je vais le récupérer dans une variable que
00:06:40 :je vais appeler lw-item et on va créer un qtwidgets.qlistwidgetitem comme ceci. Et ceqlistwidgetitem on va lui passer un texte et donc le texte qu'on va lui passer ça va être path toutsimplement qui correspond au chemin de mon image. Ce listewidgetitem ensuite on va lui donner une
00:07:00 :icône donc on va faire un set icon avec donc la méthode set icon et on va lui passer l'imageunchecked. Donc si vous vous souvenez bien dans la partie précédente dans notre fichier main ici on
00:07:11 :avait créé une méthode image unchecked qui avait un décorateur cached property. Donc ça veut direque cette méthode on peut y accéder directement dans notre main window à partir du contexte. Donc
00:07:22 :là si vous vous souvenez bien quand on a créé l'instance de main window on lui a passé notreapplication context dans le paramètre context et dans notre main window. Si on retourne tout au
00:07:30 :dessus dans la méthode init on a récupéré ce contexte dans l'attribut self.ctx. On l'utilisenotamment dans modifywidget ici pour aller récupérer le chemin de notre feuille de style. Donc là on
00:07:41 :va pouvoir faire la même chose sauf que cette fois ci on ne va pas utiliser getResource on vautiliser directement notre propriété donc notre propriété image unchecked qui va nous retourner unqueue icon de notre image unchecked. Donc ce que je vais faire ici c'est tout simplement self.ctx
00:07:56 :.image-unchecked comme ceci et ça ça va me retourner en fait le queue icon que j'ai définiici et qui va être caché dans la mémoire de mon ordinateur. Donc c'est bon pour l'icône et la
00:08:09 :dernière chose que je vais rajouter c'est en fait un attribut qu'on va mettre sur le list widgetitem. Donc je vais l'appeler processed et je vais le mettre par défaut à false. Donc pourquoi je
00:08:18 :fais ça parce qu'il se peut quand on lance le processus de conversion que à un moment donnéon arrête le processus en cours de réalisation. Donc imaginez que vous avez par exemple dix images
00:08:29 :à convertir et qu'au bout de cinq images vous arrêtez la conversion et que par la suite vousvoulez relancer cette conversion. Et bien je vais stocker en fait le statut de la conversion dans
00:08:38 :cet attribut process. Donc c'est à dire que les images qui auront déjà été converties je vaischanger cet attribut et je vais le mettre à true. Comme ça quand on va relancer le processus on
00:08:47 :pourra facilement savoir si l'image a déjà été ou non convertie. Donc c'est pour ça que je créecet attribut. Par défaut on le met à false puisque par défaut quand on glisse les images dans
00:08:56 :l'interface et bien elles ne seront pas converties. Donc par défaut processed ici sera égal à false.Et il va me rester à ajouter donc ce list widget item à l'intérieur de mon list widget. Donc pour
00:09:07 :ça on fait self.listwidgetfiles.additem qui me permet d'ajouter un item. Donc dans les partiesprécédentes on avait ajouté directement le chemin vers le fichier. Là dans ce cas ci on va ajouter
00:09:17 :notre list widget item qui contient l'icône et qui contient le chemin vers mon fichier. Doncnormalement on a tout qui fonctionne ici. On a notre méthode add files qui récupère le chemin du
00:09:28 :fichier. On récupère tous les items qui sont déjà dans notre list widget donc tous les chemins denos items. On vérifie si le path n'est pas dans cette liste. S'il n'est pas dans cette liste on
00:09:38 :crée un list widget item. On fait un set icon pour changer l'icône. On met cet attribut à false pourindiquer que l'image n'a pas été processée. Et ensuite on ajoute cet item dans notre list widget
00:09:49 :item. Donc on va vérifier que tout ça fonctionne. On va lancer notre interface et on va déposer desimages à l'intérieur de notre list widget. Donc je vais reprendre ces trois images que j'utilise
00:09:58 :depuis le début. Je les glisse et je les dépose dans mon interface. Je lâche ici et ça fonctionneparfaitement. On a bien les chemins qui sont ajoutés et l'icône qui apparaît ici à gauche.
00:10:09 :Je vais essayer de voir si la gestion des doublons marche bien également. Donc je vais reprendre cestrois images ici. Je vais les glisser dans mon interface et là vous voyez qu'elles ne s'ajoutent
00:10:18 :pas de nouveau dans mon liste widget puisque on a bien la vérification de notre structureconditionnelle qui est effective ici, qui vérifie donc déjà que le chemin qu'on ajoute n'est pasdans la liste des chemins qu'on a récupéré. Donc ce que je vais faire juste pour vous montrer c'est
00:10:31 :faire un print de cette liste items et vous allez voir que tout simplement ça va nous retourner lechemin de toutes les images qui sont déjà dans notre interface. Donc je ferme cette interface,
00:10:40 :je relance pour vous montrer, je prends donc une image ici par exemple, je la glisse àl'intérieur de mon interface. Si on regarde ici donc la première fois on a une liste vide puisque
00:10:51 :la première fois que je glisse mon image la liste est vide donc on récupère une liste vide, c'estnormal. Par contre si la deuxième fois donc je prends une autre image, je la glisse à l'intérieur
00:11:00 :de mon interface et bien logiquement on devrait avoir le chemin de cette première image. Donc làvous voyez c'est ce qu'on a ici, on a le chemin de la première image qu'on avait ajoutée. Si
00:11:08 :j'essaie de nouveau donc de prendre cette image que j'ai déjà ajoutée dans la liste et de la glisserde nouveau dans mon interface ça ne va pas marcher puisque la compréhension de liste que l'on a faitici va nous retourner la liste des images qui sont déjà dans notre liste widget et on aura déjà
00:11:21 :l'image donc ici dsc 4636 et donc cette structure conditionnelle ne sera pas vérifiée puisque pathsera dans notre liste item. Donc là on vérifie s'il n'est pas dans notre liste item ici et donc
00:11:34 :si le path est déjà dedans on ne passe pas à l'intérieur de cette structure et on n'ajoute pasl'image. Donc ça fonctionne parfaitement si j'essaie de glisser on n'arrive pas à l'ajouter
00:11:42 :par contre si je prends la troisième image qui n'est pas dans la liste ici et que je la déposeet bien elle va être ajoutée dans mon liste widget. Donc ça fait beaucoup de choses dans
00:11:50 :cette partie mais vous voyez qu'au final c'est juste en fait pas mal de vérifications. Il y acette partie ici avec la compréhension de liste qui est peut-être un petit peu plus complexemais après c'est juste ici une structure conditionnelle, on passe par un liste widgetitem, le nom des méthodes est assez explicite, cette icône pour changer l'icône il n'y a pas
00:12:06 :vraiment de mystère ici. Il y a le petit process ici qui pour l'instant fait pas forcément beaucoupde sens pour vous mais vous allez voir dans les prochaines parties quand on va commencer à fairela conversion et bien on va utiliser cet attribut et vous verrez qu'il est très pratique pour pouvoir
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.