Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue192:python [2023/05/01 08:02] – d52fr | issue192:python [2023/05/04 15:00] (Version actuelle) – andre_domenech |
---|
Quoi qu'il en soit, plutôt que de s'attarder sur les parties manquantes, nous devrions nous réjouir de ce qui existe. | Quoi qu'il en soit, plutôt que de s'attarder sur les parties manquantes, nous devrions nous réjouir de ce qui existe. |
| |
Selon moi, deux widgets sont particulièrement utiles en raison du grand nombre de choses que l'on peut faire avec eux. Le premier est le widget Canvas. Il permet non seulement de dessiner des lignes, des arcs, du texte et d'autres choses, mais il peut également contenir des images et servir de conteneur pour d'autres widgets. L'autre widget est le widget Texte, qui fait l'objet de l'article de ce mois-ci. | Selon moi, deux widgets sont particulièrement utiles en raison du grand nombre de choses que l'on peut faire avec eux. Le premier est le widget Canvas. Il permet non seulement de dessiner des lignes, des arcs, du texte et d'autres choses, mais il peut également contenir des images et servir de conteneur pour d'autres widgets. L'autre est le widget Texte, qui fait l'objet de l'article de ce mois-ci. |
| |
**Anyone who is used to creating GUIs knows that there are two "normal" widgets that support multiple lines of text, the text widget and the Message widget, both of which are part of the "standard" Tk widget set. Both work for displaying multiple lines of text, but the Text widget allows for input of text as well. | **Anyone who is used to creating GUIs knows that there are two "normal" widgets that support multiple lines of text, the text widget and the Message widget, both of which are part of the "standard" Tk widget set. Both work for displaying multiple lines of text, but the Text widget allows for input of text as well. |
Une fois que vous avez défini votre (vos) police(s), vous pouvez commencer à définir votre (vos) balise(s). Bien sûr, il y a une mise en garde. Il existe de NOMBREUSES options pour une balise. La police n'est qu'une des 19 options disponibles. Vous trouverez la liste des options à l'adresse https://www.tcl.tk/man/tcl8.3/TkCmd/text.html ou dans le manuel Tkinter 8.5 de New Mexico Tech à l'adresse https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/text-methods.html sous la méthode .tag_config. | Une fois que vous avez défini votre (vos) police(s), vous pouvez commencer à définir votre (vos) balise(s). Bien sûr, il y a une mise en garde. Il existe de NOMBREUSES options pour une balise. La police n'est qu'une des 19 options disponibles. Vous trouverez la liste des options à l'adresse https://www.tcl.tk/man/tcl8.3/TkCmd/text.html ou dans le manuel Tkinter 8.5 de New Mexico Tech à l'adresse https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/text-methods.html sous la méthode .tag_config. |
| |
En gros, la syntaxe est à peu près la suivante... | En gros, la syntaxe est à peu près la suivante : |
| |
.tag_config(tagname, option1, option2, ...) | .tag_config(tagname, option1, option2, ...) |
Afin d'utiliser des images dans votre widget Texte, vous devez vous rappeler que les images doivent être dans les formats supportés nativement par Tkinter (.xbm, .gif, .pgm, .ppm ou .png). Si vous souhaitez prendre en charge les fichiers .jpg, vous pouvez le faire, mais vous devez utiliser la bibliothèque Pillow. | Afin d'utiliser des images dans votre widget Texte, vous devez vous rappeler que les images doivent être dans les formats supportés nativement par Tkinter (.xbm, .gif, .pgm, .ppm ou .png). Si vous souhaitez prendre en charge les fichiers .jpg, vous pouvez le faire, mais vous devez utiliser la bibliothèque Pillow. |
| |
Comme pour les balises, vous devez utiliser la méthode .image_create(), dont la syntaxe est la suivante | Comme pour les balises, vous devez utiliser la méthode .image_create(), dont la syntaxe est la suivante : |
| |
.image_create(index, option1, option2, ...) | .image_create(index, option1, option2, ...) |
Enfin, nous pouvons commencer avec le code. J'ai choisi d'utiliser PAGE 7.6 pour créer l'interface graphique. Il y a de nombreuses raisons à cela, mais la plus importante est que PAGE fournit non seulement le widget Texte mais aussi un widget Texte déroulant qui possède déjà les barres de défilement. | Enfin, nous pouvons commencer avec le code. J'ai choisi d'utiliser PAGE 7.6 pour créer l'interface graphique. Il y a de nombreuses raisons à cela, mais la plus importante est que PAGE fournit non seulement le widget Texte mais aussi un widget Texte déroulant qui possède déjà les barres de défilement. |
| |
Lorsque j'ai conçu l'interface graphique, j'ai utilisé le widget ScrolledText tel qu'il est « prêt à l'emploi », en ne modifiant qu'un seul attribut par rapport à la valeur par défaut. Il s'agissait de définir l'attribut « wrap » en « word », ce que je fais 94% du temps. Une fois l'interface graphique créée, j'ai commencé à travailler sur le code du module de support. Tout d'abord, j'ai dû ajouter à la section d'importation (illustrée ci-dessus). | Lorsque j'ai conçu l'interface graphique, j'ai utilisé le widget ScrolledText tel qu'il est « prêt à l'emploi », en ne modifiant qu'un seul attribut par rapport à la valeur par défaut. Il s'agissait de définir l'attribut « wrap » en « word », ce que je fais 94 % du temps. Une fois l'interface graphique créée, j'ai commencé à travailler sur le code du module de support. Tout d'abord, j'ai dû ajouter quelque chose à la section d'importation (illustrée ci-dessus). |
| |
Je devais inclure le module de police de tkinter ainsi que la boîte de message (juste au cas où) et paramétrer filedialog, afin que l'utilisateur puisse importer un fichier texte. | Je devais inclure le module de police de tkinter ainsi que la boîte de message (juste au cas où) et paramétrer filedialog, afin que l'utilisateur puisse importer un fichier texte. |
Vous pouvez voir qu'il y a trois balises axées sur la police et trois balises axées sur la couleur. Le menu contextuel permet à l'utilisateur de définir les balises de police et de couleur. | Vous pouvez voir qu'il y a trois balises axées sur la police et trois balises axées sur la couleur. Le menu contextuel permet à l'utilisateur de définir les balises de police et de couleur. |
| |
La fonction suivante que j'ai créée est le rappel Keypress (en bas à droite). Je l'utilise pour suivre l'index INSERT. J'interroge l'index INSERT à chaque fois qu'une touche du clavier est relâchée pour éviter que les rebonds de touches n'envoient de faux signaux. Le message arrive sous la forme d'un message « line.column ». J'utilise la méthode des chaînes de caractères .find pour rechercher le point. Je vérifie ensuite la méthode tag_ranges pour voir si des caractères sont sélectionnés en tant que « groupe ». N'oubliez pas que si vous essayez d'utiliser les index SEL_FIRST et SEL_LAST et que rien n'est sélectionné, vous obtiendrez une erreur. Pour éviter cela, j'appelle la méthode tag_ranges pour obtenir un tuple contenant les valeurs First et Last. Si rien n'est sélectionné, la valeur renvoyée sera un tuple vide. Ainsi, en vérifiant la valeur renvoyée pour voir si la longueur est supérieure à 0, je peux voir en toute sécurité s'il y a eu sélection et de quoi il s'agit. À la fin de la fonction, j'envoie les informations aux deux widgets Label au bas du formulaire. | La fonction suivante que j'ai créée est le rappel Keypress (en bas à droite). Je l'utilise pour suivre l'index INSERT. J'interroge l'index INSERT à chaque fois qu'une touche du clavier est relâchée pour éviter que les rebonds de touches n'envoient de faux signaux. Le message arrive sous la forme d'un message « line.column ». J'utilise la méthode des chaînes de caractères .find pour rechercher le point. Je vérifie ensuite la méthode tag_ranges pour voir si des caractères sont sélectionnés en tant que « groupe ». N'oubliez pas que si vous essayez d'utiliser les index SEL_FIRST et SEL_LAST et que rien n'est sélectionné, vous obtiendrez une erreur. Pour éviter cela, j'appelle la méthode tag_ranges pour obtenir un tuple contenant les valeurs First et Last. Si rien n'est sélectionné, la valeur renvoyée sera un tuple vide. Ainsi, en vérifiant la valeur renvoyée pour voir si la longueur est supérieure à 0, je peux voir en toute sécurité s'il y a eu sélection et laquelle. À la fin de la fonction, j'envoie les informations aux deux widgets Label au bas du formulaire. |
| |
| |
Ensuite, voici la fonction qui insère une image (page suivante, en haut à droite). Tout d'abord, comme pour le chargement d'un fichier, nous devons utiliser la boîte de dialogue de fichier askopenfilename pour obtenir le nom de l'image que nous souhaitons utiliser. | Ensuite, voici la fonction qui insère une image (page suivante, en haut à droite). Tout d'abord, comme pour le chargement d'un fichier, nous devons utiliser la boîte de dialogue de fichier askopenfilename pour obtenir le nom de l'image que nous souhaitons utiliser. |
| |
Une fois que nous avons le nom du fichier image, nous jouons avec le nom du fichier. Nous devons également créer une copie globale de l'objet fichier afin que le ramasse-miettes de Python ne s'en débarrasse pas avant qu'il ne soit visible. La méthode d'insertion de l'image a la syntaxe suivante... | Une fois que nous avons le nom du fichier image, nous jouons avec le nom du fichier. Nous devons également créer une copie globale de l'objet fichier afin que le ramasse-miettes de Python ne s'en débarrasse pas avant qu'il ne soit visible. La méthode d'insertion de l'image a la syntaxe suivante : |
| |
.image_create(index,image, nom_image, align, padx, pady) | .image_create(index,image, nom_image, align, padx, pady) |
Le principal inconvénient des balises est qu'il peut y avoir plus d'une balise appliquée à un bloc de texte à un moment donné. En fait, il est possible que chaque balise définie soit appliquée à un bloc de texte donné. | Le principal inconvénient des balises est qu'il peut y avoir plus d'une balise appliquée à un bloc de texte à un moment donné. En fait, il est possible que chaque balise définie soit appliquée à un bloc de texte donné. |
| |
Cela peut poser un problème, car lorsqu'il existe plusieurs balises pour un bloc donné, c'est la balise la plus récemment créée qui prend le contrôle et qui est affichée. Vous pouvez utiliser les méthodes .tag_raise() et .tag_lower comme suit... | Cela peut poser un problème, car lorsqu'il existe plusieurs balises pour un bloc donné, c'est la balise la plus récemment créée qui prend le contrôle et qui est affichée. Vous pouvez utiliser les méthodes .tag_raise() et .tag_lower comme suit : |
| |
.tag_raise(tagname, abovethis=None) | .tag_raise(tagname, abovethis=None) |
Pour « activer » une balise différente dans la pile, vous devez savoir laquelle et combien de balises sont définies pour ce bloc de texte. | Pour « activer » une balise différente dans la pile, vous devez savoir laquelle et combien de balises sont définies pour ce bloc de texte. |
| |
Pour savoir quelles balises sont définies pour un bloc de texte, vous pouvez utiliser la fonction | Pour savoir quelles balises sont définies pour un bloc de texte, vous pouvez utiliser la fonction : |
| |
.tag_names(index) | .tag_names(index) |
Le widget Texte offre de nombreuses autres fonctionnalités, telles que la recherche, l'annulation et le rétablissement des modifications, et bien d'autres encore. Cependant, je voulais essayer de limiter la démo et l'article à une longueur raisonnable. | Le widget Texte offre de nombreuses autres fonctionnalités, telles que la recherche, l'annulation et le rétablissement des modifications, et bien d'autres encore. Cependant, je voulais essayer de limiter la démo et l'article à une longueur raisonnable. |
| |
Sérieusement, je pourrais écrire la moitié d'un livre sur le widget Texte. Voici à nouveau les liens vers les deux ressources pour en savoir plus. | Sérieusement, je pourrais écrire la moitié d'un livre sur le widget Texte. Voici à nouveau les liens vers les deux ressources pour en savoir plus : |
| |
https://www.tcl.tk/man/tcl8.3/TkCmd/text.html | https://www.tcl.tk/man/tcl8.3/TkCmd/text.html |