⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ controles standards ⇨ Text
Tutoriel de tkinter.Text ( )
⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ controles standards ⇨ Text
Tutoriel de tkinter.Text ( )
DESCRIPTION.
Créer un nouveau controle de type éditeur de texte ou texte long ou texte multilignes (widget : tkinter.Text ( )).
SYNTAXE.
TXT_Texte = tkinter.Text ( parent , attribut1 = valeur , ... , attributn = valeur )
TXT_Texte = ⇨ affectation de l'instance du controle [ optionnel ]
tkinter.Text ( ) ⇨ création d'une instance de tkinter.Text ( ) [ OBLIGATOIRE ]
parent ⇨ conteneur de l'instance de tkinter.Text ( ) [ OBLIGATOIRE ]
attribut = valeur ⇨ attribut à modifier avec sa nouvelle valeur [ optionnel ]
REMARQUES.
Les classes tkinter.Text ( ) et tkinter.Canvas ( ) du module tkinter sont des classes produisant des super controles.
Les éditeurs de textes, ou textes longs, ou textes multilignes, créés avec la classe tkinter.Text ( ) peuvent être utilisés comme une façon élégante de placer du texte dans une fenêtre ou tout autre conteneur, mais c'est plus un véritable éditeur de texte, voire un traitement de texte, à personnaliser et à insérer dans votre application. De ce fait, il nécessite un peu de temps pour en assimiler, et mettre en oeuvre, toutes les subtilités et possibilités qu'offrent l'ensemble des ses attributs et méthodes.
Les objets créés avec la classe tkinter.Text ( ) offrent de nombreuses fonctionnalités pour l'édition de textes riches et agréables à consulter en restant pourtant aisément modifiables. Cela est réalisable, comme souvent avec les classes Python, grâce à une collection de méthodes spécialisées, regroupées en notions plus générales, rendant le développement et la maintenance d'une application rapide, simple et efficace. Chacune de ces notions sont détaillées dans la partie traitant des méthodes qui s'y rattachent. Ils permettent, entre autre, de :
- définir des régions de formatages pour appliquer des fontes, attributs et couleurs ;
- insérer des image dans le texte ;
- lier des gestionnaires d'événement différents selon la position du la souris dans le texte ,
- placer des contrôles (dans des fenêtres d'insertions) à l'intérieur du texte lui-même ...
- gérer la gestion des tabulations et la césure des mots dans une lignes ;
- utiliser les index de positionnement et les marqueurs de rappels ;
- utiliser l'historique des modifications ;
Les objets permanents de type tkinter.Text ( ) sont identifiés dans le site par : TXT_.
Voir les conventions sur les variables utilisées dans ce site ...
CREATION D'UN EDITEUR DE TEXTE.
Les éditeurs de texte, ou textes multilignes, sont crées comme tous les autres controles de tkinter, et leur premier attribut, lors de l'appel du constructeur de la classe tkinter.Text ( ) doit être l'identification de son conteneur, son parent. Il est prudent de définir, dès la création de l'éditeur de texte, une couleur de fond et ses dimensions.
import tkinter
TKI_Principal = tkinter.Tk ( )
tkinter.Text ( TKI_Principal , bg = "cornsilk" , width = 30 , height = 10 ).pack ( )
tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy ).pack ( )
TKI_Principal.mainloop ( )
IMPORTER, MODIFIER ET SAUVEGARDER UN TEXTE DANS UN EDITEUR DE TEXTE.
Les éditeurs de texte obtenus avec tkinter.Text ( ) sont idéaux pour créer ou importer des fichiers textes, au format .txt ou des scripts Python, au format .py ou .pyw, pour les consulter, éventuellement les modifier, et si le programme le prévoit sauvegarder ces changements pour une utilisation ultérieure. Le tout très rapidement et simplement, en quelques lignes de codage. L'exemple suivant créer un bloc note minimaliste mais parfaitement fonctionnel.
La méthode tkinter.Text ( ).insert ( ) permet de placer un texte dans un éditeur de texte, soit depuis la position d'insertion courante, soit en indiquant un endroit précis dans le contenu déjà présent dans le controle avec la méthode tkinter.Text ( ).index ( ). Inversement la méthode tkinter.Text ( ).get ( ) retourne tout ou partie du texte d'un l'éditeur de texte.
import tkinter , tkinter.filedialog
def FNC_Nouveau ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kobjet = tkinter.filedialog.asksaveasfile ( title = "Nouveau" , filetypes = kextentions , defaultextension = ".txt" )
if kobjet == None : return
kfichier = kobjet.name
TKV_Fichier.set ( kfichier )
TXT_Editeur.delete ( "1.0" , "end" )
def FNC_Ouvrir ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kfichier = tkinter.filedialog.askopenfilename ( title = "Ouvrir" , filetypes = kextentions )
if len ( kfichier ) < 1 : return
TXT_Editeur.delete ( "1.0" , "end" )
TKV_Fichier.set ( kfichier )
with open ( kfichier ) as FIL_Fichier : TXT_Editeur.insert ( "end" , FIL_Fichier.read ( ) )
def FNC_Sauver ( ) :
if TKV_Fichier.get ( ) == None : return
ktexte = TXT_Editeur.get ( "1.0" , "end" )
with open ( TKV_Fichier.get ( ) , mode = "w" , encoding = "utf-8" ) as FIL_Fichier : FIL_Fichier.write ( ktexte )
TKI_Principal = tkinter.Tk ( )
TKV_Fichier = tkinter.StringVar ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
BUT_Nouveau = tkinter.Button ( TKI_Principal , text = "Nouveau" , command = FNC_Nouveau )
BUT_Ouvrir = tkinter.Button ( TKI_Principal , text = "Ouvrir" , command = FNC_Ouvrir )
BUT_Sauver = tkinter.Button ( TKI_Principal , text = "Enregistrer" , command = FNC_Sauver )
LAB_Fichier = tkinter.Label ( TKI_Principal , textvariable = TKV_Fichier , relief = "solid" , bd = 3 , height = 2 )
TXT_Editeur = tkinter.Text ( TKI_Principal , wrap = "none" , width = 80 , height = 25 )
LAB_Fichier.grid ( row = 0 , column = 0 , columnspan = 4 , sticky = "nesw" )
TXT_Editeur.grid ( row = 1 , column = 0 , columnspan = 4 )
BUT_Nouveau.grid ( row = 2 , column = 0 , sticky = "nesw" )
BUT_Ouvrir.grid ( row = 2 , column = 1 , sticky = "nesw" )
BUT_Sauver.grid ( row = 2 , column = 2 , sticky = "nesw" )
BUT_Quitter.grid ( row = 2 , column = 3 , sticky = "nesw" )
TKV_Fichier.set ( None )
TXT_Editeur.focus_force ( )
TKI_Principal.mainloop ( )
FAIRE DEFILER UN EDITEUR DE TEXTE EN LUI ASSOCIANT DES ASCENSEURS.
Les attributs width et height d'un objet créé avec la classe tkinter.Text ( ), définissent les dimensions de visibilité de cet l'objet. Si le texte contenu dans cet objet contient plus de lignes, que la valeur associée à l'attribut height, ces lignes ne seront pas visibles. De Même, si l'attribut wrap reçoit la valeur "none", et que des lignes comportent plus de caractères que la valeur de l'attribut width, ces caractères sortiront de la zone de visibilité actuelle par la droite.
Dans la plupart des cas, il sera possible de faire défiler le texte, de haut en bas dans la zone de visibilité, avec la molette de la souris, et parfois de droite à gauche, avec les touches d'édition flèches avance et retour. Mais il reste préférable d'associer des objets tkinter.Scrollbar ( ) aux éditeurs de texte pour les parcourir de façon précise, rapide et facile.
Note : Le module tkinter propose aussi un sous-module ajoutant la classe. Cette classe permet de créer des objets associant un éditeur de texte (tkinter.Text ( )) avec un ascenseur vertical (tkinter.Scrollbar ( )) dans un cadre sans titre (tkinter.Frame ( )). Voir tkinter.scrolledtext.ScrolledText ( ) pour plus de détails.
import tkinter , tkinter.filedialog
def FNC_Ouvrir ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kfichier = tkinter.filedialog.askopenfilename ( title = "Ouvrir" , filetypes = kextentions )
if len ( kfichier ) < 1 : return
LAB_Fichier [ "text" ] = kfichier
TXT_Editeur.delete ( "1.0" , "end" )
with open ( kfichier ) as FIL_Fichier : TXT_Editeur.insert ( "end" , FIL_Fichier.read ( ) )
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Fermer le programme" , command = TKI_Principal.destroy )
BUT_Ouvrir = tkinter.Button ( TKI_Principal , text = "Ouvrir un fichier txt ou py" , command = FNC_Ouvrir )
LAB_Fichier = tkinter.Label ( TKI_Principal , relief = "solid" , bd = 3 , height = 2 )
BAR_Vertical = tkinter.Scrollbar ( TKI_Principal , orient = "vertical" )
BAR_Horizontal = tkinter.Scrollbar ( TKI_Principal , orient = "horizontal" )
TXT_Editeur = tkinter.Text ( TKI_Principal , wrap = "none" , width = 40 , height = 15 )
LAB_Fichier.grid ( row = 0 , column = 0 , columnspan = 2 , sticky = "nesw" )
TXT_Editeur.grid ( row = 1 , column = 0 , sticky = "nesw" )
BAR_Vertical.grid ( row = 1 , column = 1 , sticky = "nesw" )
BAR_Horizontal.grid ( row = 2 , column = 0 , sticky = "nesw" )
BUT_Ouvrir.grid ( row = 3 , column = 0 , columnspan = 2 , sticky = "nesw" )
BUT_Quitter.grid ( row = 4 , column = 0 , columnspan = 2 , sticky = "nesw" )
TXT_Editeur [ "yscrollcommand" ] = BAR_Vertical.set
TXT_Editeur [ "xscrollcommand" ] = BAR_Horizontal.set
BAR_Vertical [ "command" ] = TXT_Editeur.yview
BAR_Horizontal [ "command" ] = TXT_Editeur.xview
TXT_Editeur.focus_force ( )
TKI_Principal.mainloop ( )
FAIRE DEFILER UN EDITEUR DE TEXTE AVEC LA SOURIS.
Si des parties du texte présent dans un éditeur de texte sortaient de la zone de visibilité défini avec les attributs width et height, il est possible de naviguer dans le texte, avec les méthodes tkinter.Text ( ).scan_mark ( ) et tkinter.Text ( ).scan_dragto ( ). qui feront défiler le texte pour placer la partie recherchée dans la zone de visibilité de l'éditeur de texte.
L'utilisation, en association, de ces 2 méthodes, permet à l'utilisateur de faire défiler l'intégralité du texte par un cliquer-glisser classique, c'est-à-dire en plaçant le pointeur de la souris sur le controle tkinter.Text ( ) puis, en maintenant le bouton de la souris enfoncé, de déplacer le pointeur pour modifier la partie du texte visible. Généralement, le bouton gauche et la molette de la souris ayant déjà des actions particulières, on utilisera de préférence le bouton droit de la souris, "<ButtonPress-2>" ou "<ButtonPress-3>" selon l'environnement de l'utilisateur, pour cette procédure.
Cette action ce programme en 2 temps. Tous d'abord, il faut lier un gestionnaire d'événement qui invoquera la méthode tkinter.Text ( ).scan_mark ( ) lors d'un appui sur un bouton de la souris pour lui passer les coordonnées initiales du pointeur de la souris. Ensuite, un autre gestionnaire surveillant le déplacement de la souris si un bouton est enfoncé (voir liste des modificateurs d'événements) appellera la méthode tkinter.Text ( ).scan_dragto ( ). qui effectuera le déplacement du texte en fonction des coordonnées du pointeur de la souris.
import tkinter , tkinter.filedialog
def FNC_Deplacer ( event ) :
TXT_Editeur.scan_dragto ( event.x , event.y )
def FNC_Enfoncer ( event ) :
TXT_Editeur.scan_mark ( event.x , event.y )
def FNC_Ouvrir ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kfichier = tkinter.filedialog.askopenfilename ( title = "Ouvrir" , filetypes = kextentions )
if len ( kfichier ) < 1 : return
LAB_Fichier [ "text" ] = kfichier
TXT_Editeur.delete ( "1.0" , "end" )
with open ( kfichier ) as FIL_Fichier : TXT_Editeur.insert ( "end" , FIL_Fichier.read ( ) )
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Fermer le programme" , command = TKI_Principal.destroy )
BUT_Ouvrir = tkinter.Button ( TKI_Principal , text = "Ouvrir un fichier txt ou py" , command = FNC_Ouvrir )
LAB_Fichier = tkinter.Label ( TKI_Principal , relief = "solid" , bd = 3 , height = 2 )
TXT_Editeur = tkinter.Text ( TKI_Principal , wrap = "none" , width = 40 , height = 15 )
TXT_Editeur.bind ( "<ButtonPress-3>" , FNC_Enfoncer )
TXT_Editeur.bind ( "<Button3-Motion>" , FNC_Deplacer )
LAB_Fichier.pack ( fill = "both" )
TXT_Editeur.pack ( )
BUT_Ouvrir.pack ( fill = "both" )
BUT_Quitter.pack ( fill = "both" )
TXT_Editeur.focus_set ( )
TKI_Principal.mainloop ( )
DEFINIR LES TABULATION DANS UN EDITEUR DE TEXTE.
Par défaut, chaque utilisation de la touche tabulation du clavier place de 8 caractères d'espacement, à partir du curseur d'insertion, vers la droite.
L'attribut tabs des éditeurs de texte de tkinter permet de modifier ce comportement en définissant des taquets et leur position dans un tuple ( ). Après avoir épuisé les valeurs présentes dans le tuple ( ), chaque position supplémentaire sera égal à l'écart entre les 2 derniers éléments du tuple ( ). L'emploi de la touche tabulation déplacera, alors, le curseur d'insertion vers la droite, sous le taquet le plus proche de sa position actuelle.
Par exemple : tabs = ( "5c" , "2c" , "4c" , "7c" ) placera :
- un taquet à 5 cm de la marge gauche du texte ;
- puis un taquet 2 cm plus à droite, soit 7 cm de la marge gauche du texte ;
- puis un taquet 4 cm plus à droite, soit 11 cm de la marge gauche du texte ;
- puis un taquet 7 cm plus à droite, soit 18 cm de la marge gauche du texte ;
- ensuite, un taquet sera placé tous les (7 - 4) = 3 cm plus à droite, soit 21, 24, 27, 30, ... cm de la marge gauche du texte.
Il est aussi possible de modifier l’alignement du texte par rapport au taquet en le précisant après sa valeur :
- "left", (par défaut) la position du taquet est à gauche du texte ;
- "center", la position du taquet est au centre du texte ;
- "right", la position du taquet est à droite du texte ;
- "numeric" la position du le taquet est positionné sur le premier . (point) du texte.
Par exemple : tabs = ( "5c" , "right" , "2c" , "7c" , "numeric" , "3c" , "center" ).Toutes les tabulations suivantes seront à 4 cm et centrée. Les tabulations après la dernière valeur seront alignée comme celle de la dernière valeur.
Il est possible de choisir entre plusieurs unités de mesure pour les tabulations : rien pour pixel ; c pour cm (recommandé) ; m pour mm ; i pour pouce ; p pour point. Si l'unité de mesure le permet, il est aussi possible de préciser des nombres décimaux ( par exemple : "2.7c" pour 2,7 cm)
import tkinter
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
TXT_Editeur = tkinter.Text ( TKI_Principal , width = 80 , height = 5 )
TXT_Editeur.pack ( )
BUT_Quitter.pack ( )
TXT_Editeur [ "tabs" ] = ( "1c" , "3c" , "right" , "2c" , "numeric" , "1c" , "left" , "3c" , "center" )
TXT_Editeur.insert ( "1.0" , "Python est un langage de programmation puissant et facile à apprendre." )
TKI_Principal.mainloop ( )
L'HISTORIQUE DES MODIFICATIONS DES EDITEURS DE TEXTE.
Les éditeurs de texte créés avec tkinter.Text ( ) dispose d'un mécanisme de mémorisation des modifications réalisées dans leur contenu, ou historique d'annulation. Chaque nouvelle modification dans un controle tkinter.Text ( ) est donc archivée dans une pile, en enregistrant le contenu avant et après la modifications.
Par défaut ce mécanisme est activé, mais il est possible de le désactiver, pour interdire l'annulation des modifications, ou de le réactiver avec l'attribut undo. De même, la pile d'annulation est gérée automatiquement, mais l'attribut autoseparator autorise ou non l'utilisation de la méthode tkinter.Text ( ).edit_separator ( ) pour que l'utilisateur, ou au script, puisse placer lui-même des marqueurs dans la pile d'annulation.
La méthode tkinter.Text ( ).edit_undo ( ) annule une ou des modifications. Ces appels se font en listant les actions présentes dans la pile des modifications de haut en bas jusqu'à la fin de la pile. Après une annulation ou des annulations successives, et tant qu'aucune nouvelle modification n'est apportée au contenu, la méthode tkinter.Text ( ).edit_redo ( ) rétablit les modifications annulées précédemment. Enfin la méthode tkinter.Text ( ).edit_modified ( ) déplace le pointeur dans la pile d'annulation, et la méthode tkinter.Text ( ).edit_reset ( ) vide et réinitialise la pile d'annulation.
import tkinter
def FNC_Annuler ( ) :
TXT_Editeur.edit_undo ( )
def FNC_Retablir ( ) :
TXT_Editeur.edit_redo ( )
def FNC_Separer ( ) :
TXT_Editeur.edit_separator ( )
def FNC_Vider ( ) :
TXT_Editeur.edit_reset ( )
def FNC_Etat ( ) :
TXT_Editeur.edit_modified ( True )
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
BUT_Annuler = tkinter.Button ( TKI_Principal , text = "Annuler" , command = FNC_Annuler )
BUT_Retablir = tkinter.Button ( TKI_Principal , text = "Retablir" , command = FNC_Retablir )
BUT_Separer = tkinter.Button ( TKI_Principal , text = "Séparer" , command = FNC_Separer )
BUT_Vider = tkinter.Button ( TKI_Principal , text = "Vider" , command = FNC_Vider )
BUT_Etat = tkinter.Button ( TKI_Principal , text = "Balise" , command = FNC_Etat )
TXT_Editeur = tkinter.Text ( TKI_Principal , undo = True , autoseparators = True , maxundo = 25 )
TXT_Editeur.grid ( row = 0 , column = 0 , columnspan = 6 , sticky = "nesw" )
BUT_Annuler.grid ( row = 1 , column = 0 , sticky = "nesw" )
BUT_Retablir.grid ( row = 1 , column = 1 , sticky = "nesw" )
BUT_Separer.grid ( row = 1 , column = 2 , sticky = "nesw" )
BUT_Vider.grid ( row = 1 , column = 3 , sticky = "nesw" )
BUT_Etat.grid ( row = 1 , column = 4 , sticky = "nesw" )
BUT_Quitter.grid ( row = 1 , column = 5 , sticky = "nesw" )
TXT_Editeur.focus_force ( )
TKI_Principal.mainloop ( )
POSITION DES ELEMENTS DANS UN EDITEURS DE TEXTE.
Dans les éditeurs de texte créés avec tkinter.Text ( ) chaque élément de base, tel que les caractères d'un texte, mais aussi les images et les fenêtres d’insertion, se trouve à une certaine position dans le contenu. Cette position est l'index de position de l'élément , ou simplement index. Un index est exprimé par ses coordonnées dans le contenu, placées dans une chaîne de caractères, avec son abscisse qui indique le paragraphe, suite de caractères se terminant par un retour de ligne ; suivie par un point (.) ; puis son ordonnée, la place de l'élément dans son paragraphe ; soit la forme : "paragraphe.élément" où paragraphe et élément sont deux int ( ).
En plus de cette forme, un index peut avoir un nom prédéfinit correspondant à un marqueur personnalisé ou une position particulière. voir la méthode tkinter.Text ( ).index ( ) pour plus d'informations sur la liste de ces nom prédéfinis.
import tkinter , tkinter.filedialog
def FNC_Index ( ) :
kmessage = f"index proche du pointeur : { TXT_Editeur.index ( 'current' ) }\n"
kmessage += f"index sous le curseur : { TXT_Editeur.index ( 'insert' ) }\n"
try :
kmessage += f"index début de sélection : { TXT_Editeur.index ( 'sel.first' ) }\n"
kmessage += f"index fin de sélection : { TXT_Editeur.index ( 'sel.last' ) }"
except :
kmessage += "Il n'y a pas de sélection."
LAB_Index [ "text" ] = kmessage
TKI_Principal.after ( 100 , FNC_Index )
def FNC_Ouvrir ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kfichier = tkinter.filedialog.askopenfilename ( title = "Ouvrir" , filetypes = kextentions )
if len ( kfichier ) < 1 : return
LAB_Fichier [ "text" ] = kfichier
TXT_Editeur.delete ( "1.0" , "end" )
with open ( kfichier ) as FIL_Fichier : TXT_Editeur.insert ( "end" , FIL_Fichier.read ( ) )
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Fermer le programme" , command = TKI_Principal.destroy )
BUT_Ouvrir = tkinter.Button ( TKI_Principal , text = "Ouvrir un fichier txt ou py" , command = FNC_Ouvrir )
LAB_Index = tkinter.Label ( TKI_Principal , relief = "groove" , bd = 3 , height = 5 )
LAB_Fichier = tkinter.Label ( TKI_Principal , relief = "solid" , bd = 3 , height = 2 )
TXT_Editeur = tkinter.Text ( TKI_Principal , wrap = "none" , width = 40 , height = 15 )
LAB_Fichier.pack ( fill = "both" )
TXT_Editeur.pack ( )
LAB_Index.pack ( fill = "both" )
BUT_Ouvrir.pack ( fill = "both" )
BUT_Quitter.pack ( fill = "both" )
TXT_Editeur.focus_set ( )
FNC_Index ( )
TKI_Principal.mainloop ( )
MEMORISER UNE POSITION DANS UN EDITEURS DE TEXTE.
La méthode tkinter.Text ( ).mark_set ( ) offre la possibilité de marquer des éléments de base du contenu et de s'en servir ensuite comme des repères indexés, à la façon d'une balise, ou ancre, marque, repère, quelque soit la nouvelle place de ces éléments marqués. Une balise est donc une position glissante dans le contenu d'un éditeur de texte, ce qui signifie, qu'elle est à un index, qui s'actualise après chaque modification du contenu, pour rester au plus proche de l'index de l'élément auquel elle attachée, ancrée. Ces balises permettent une navigation rapide et précise dans le contenu de l'éditeur de texte.
import tkinter , tkinter.filedialog
def FNC_Controle ( event ) :
kmarque = f"marque{ event }"
BUT_Placer [ "state" ] = "normal" if kmarque in TXT_Editeur.mark_names ( ) else "disabled"
def FNC_Marquer ( ) :
kmarque = f"marque{ SCA_Marques.get ( ) }"
TXT_Editeur.mark_set ( kmarque , "insert" )
BUT_Placer [ "state" ] = "normal"
def FNC_Ouvrir ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kfichier = tkinter.filedialog.askopenfilename ( title = "Ouvrir" , filetypes = kextentions )
if len ( kfichier ) < 1 : return
LAB_Fichier [ "text" ] = kfichier
TXT_Editeur.delete ( "1.0" , "end" )
with open ( kfichier ) as FIL_Fichier : TXT_Editeur.insert ( "end" , FIL_Fichier.read ( ) )
def FNC_Placer ( ) :
kmarque = f"marque{ SCA_Marques.get ( ) }"
TXT_Editeur.mark_set ( "insert" , kmarque )
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Fermer le programme" , command = TKI_Principal.destroy )
BUT_Ouvrir = tkinter.Button ( TKI_Principal , text = "Ouvrir un fichier txt ou py" , command = FNC_Ouvrir )
BUT_Marquer = tkinter.Button ( TKI_Principal , text = "Marquer" , command = FNC_Marquer )
BUT_Placer = tkinter.Button ( TKI_Principal , text = "Aller à" , command = FNC_Placer )
SCA_Marques = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 9 , command = FNC_Controle )
LAB_Fichier = tkinter.Label ( TKI_Principal , relief = "solid" , bd = 3 , height = 2 )
TXT_Editeur = tkinter.Text ( TKI_Principal , wrap = "none" , width = 40 , height = 15 )
LAB_Fichier.grid ( row = 0 , column = 0 , columnspan = 2 , sticky = "nesw" )
TXT_Editeur.grid ( row = 1 , column = 0 , columnspan = 2 , sticky = "nesw" )
BUT_Marquer.grid ( row = 2 , column = 0 , sticky = "nesw" )
SCA_Marques.grid ( row = 2 , column = 1 , rowspan = 2 , sticky = "nesw" )
BUT_Placer.grid ( row = 3 , column = 0 , sticky = "nesw" )
BUT_Ouvrir.grid ( row = 4 , column = 0 , columnspan = 2 , sticky = "nesw" )
BUT_Quitter.grid ( row = 5 , column = 0 , columnspan = 2 , sticky = "nesw" )
FNC_Controle ( 0 )
TXT_Editeur.focus_set ( )
TKI_Principal.mainloop ( )
FORMATER DES PORTIONS DE CONTENU DANS UN EDITEURS DE TEXTE.
La classe tkinter.Text ( ) comporte 13 méthodes commençant par le suffixe tag_. Ces méthodes permettent de créer, gérer, modifier, supprimer, le formatage d'une portion de contenu, dénommées régions. Une régions pourra recevoir un formatage : police de caractères, taille, style, couleur, différent du reste du texte et/ou des autres régions. Un élément peut être associé à plusieurs formats, son aspect dépendant alors de la position des formats, aux quels il est soumis, dans l'ordre de la pile des formats. Ces 13 méthodes sont détaillées individuellement mais l'exemple ci-dessous montrent quelques'unes des possibilités disponibles.
import tkinter , tkinter.filedialog
def FNC_Appliquer ( ) :
try :
kformat = LAB_Format [ "text" ]
if kformat == "" : return
TXT_Editeur.tag_add ( kformat , "sel.first" , "sel.last" )
LAB_Message [ "text" ] = f"{ kformat } a été appliqué ..."
except :
LAB_Message [ "text" ] = f"Faites une sélection ..."
def FNC_Modifier ( ) :
kformat = LAB_Format [ "text" ]
if kformat == "" : return
kencre = SPI_Encre.get ( )
kfond = SPI_Fond.get ( )
kstyle = SPI_Style.get ( )
TXT_Editeur.tag_config ( kformat , foreground = kencre , background = kfond , font = ( None , 10 , kstyle ) )
LAB_Message [ "text" ] = f"{ kformat } ({ kencre } sur { kfond } en { kstyle } )"
def FNC_Nouveau ( ) :
kvaleur = len ( TXT_Editeur.tag_names ( ) )
kformat = f"Format_{ kvaleur }"
LAB_Format [ "text" ] = f"{ kformat }"
FNC_Modifier ( )
BOX_Liste.delete ( 0 , "end" )
for kformat in TXT_Editeur.tag_names ( ) :
if kformat != "sel" : BOX_Liste.insert ( "end" , kformat )
FNC_Appliquer ( )
def FNC_Ouvrir ( ) :
kextentions = [ ( "texte" , ".txt" ) , ( "python" , ".py" ) ]
kfichier = tkinter.filedialog.askopenfilename ( title = "Ouvrir" , filetypes = kextentions )
if len ( kfichier ) < 1 : return
TXT_Editeur.delete ( "1.0" , "end" )
LAB_Fichier [ "text" ] = kfichier
with open ( kfichier ) as FIL_Fichier : TXT_Editeur.insert ( "end" , FIL_Fichier.read ( ) )
def FNC_Selection ( event ) :
try :
kformat = BOX_Liste.get ( BOX_Liste.curselection ( ) )
kencre = TXT_Editeur.tag_cget ( kformat , "foreground" )
kfond = TXT_Editeur.tag_cget ( kformat , "background" )
kstyle = TXT_Editeur.tag_cget ( kformat , "font" )
LAB_Message [ "text" ] = f"{ kformat } ({ kencre } sur { kfond } en { kstyle }) est sélectionnée ..."
LAB_Format [ "text" ] = f"{ kformat }"
except :
LAB_Message [ "text" ] = f"Créez d'abords une région (tag) ..."
def FNC_Supprimer ( ) :
kformat = LAB_Format [ "text" ]
if kformat == "" : return
TXT_Editeur.tag_delete ( kformat )
BOX_Liste.delete ( 0 , "end" )
for kformat in TXT_Editeur.tag_names ( ) :
if kformat != "sel" : BOX_Liste.insert ( "end" , kformat )
LAB_Message [ "text" ] = f"{ kformat } a été supprimé ..."
LAB_Format [ "text" ] = ""
TKI_Principal = tkinter.Tk ( )
kcouleurs = ( "black" , "red" , "lime" , "blue" , "aqua" , "magenta" , "yellow" , "green" , "white" , "sienna" , "pink" , "palegreen" )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
BUT_Nouveau = tkinter.Button ( TKI_Principal , text = "Créer" , command = FNC_Nouveau )
BUT_Ouvrir = tkinter.Button ( TKI_Principal , text = "Ouvrir" , command = FNC_Ouvrir )
BUT_Modifier = tkinter.Button ( TKI_Principal , text = "Modifier" , command = FNC_Modifier )
BUT_Appliquer = tkinter.Button ( TKI_Principal , text = "Appliquer" , command = FNC_Appliquer )
BUT_Supprimer = tkinter.Button ( TKI_Principal , text = "Supprimer" , command = FNC_Supprimer )
SPI_Encre = tkinter.Spinbox ( TKI_Principal , values = kcouleurs , wrap = True , width = 6 )
SPI_Fond = tkinter.Spinbox ( TKI_Principal , values = kcouleurs , wrap = True , width = 6 )
SPI_Style = tkinter.Spinbox ( TKI_Principal , values = ( "normal" , "bold" , "italic" ) , wrap = True , width = 6 )
BOX_Liste = tkinter.Listbox ( TKI_Principal )
LAB_Message = tkinter.Label ( TKI_Principal , relief = "ridge" , bd = 3 , justify = "left" , anchor = "w" )
LAB_Format = tkinter.Label ( TKI_Principal , relief = "ridge" , bd = 3 )
LAB_Fichier = tkinter.Label ( TKI_Principal , relief = "solid" , bd = 1 , height = 2 )
TXT_Editeur = tkinter.Text ( TKI_Principal , wrap = "none" , width = 80 , height = 25 )
BOX_Liste.bind ( "<ButtonRelease>" , FNC_Selection )
TXT_Editeur.grid ( row = 0 , column = 0 , columnspan = 6 , sticky = "nesw" )
BOX_Liste.grid ( row = 0 , column = 6 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "encre" , anchor = "s" ).grid ( row = 1 , column = 0 , sticky = "s" )
tkinter.Label ( TKI_Principal , text = "papier" , anchor = "s" ).grid ( row = 1 , column = 1 , sticky = "s" )
tkinter.Label ( TKI_Principal , text = "style" , anchor = "s" ).grid ( row = 1 , column = 2 , sticky = "s" )
LAB_Message.grid ( row = 1 , column = 3 , columnspan = 3 , sticky = "nesw" )
LAB_Format.grid ( row = 1 , column = 6 , sticky = "nesw" )
SPI_Encre.grid ( row = 2 , column = 0 , sticky = "nesw" )
SPI_Fond.grid ( row = 2 , column = 1 , sticky = "nesw" )
SPI_Style.grid ( row = 2 , column = 2 , sticky = "nesw" )
BUT_Nouveau.grid ( row = 2 , column = 3 , sticky = "nesw" )
BUT_Modifier.grid ( row = 2 , column = 4 , sticky = "nesw" )
BUT_Appliquer.grid ( row = 2 , column = 5 , sticky = "nesw" )
BUT_Supprimer.grid ( row = 2 , column = 6 , sticky = "nesw" )
BUT_Ouvrir.grid ( row = 3 , column = 0 , sticky = "nesw" )
LAB_Fichier.grid ( row = 3 , column = 1 , columnspan = 5 , sticky = "nesw" )
BUT_Quitter.grid ( row = 3 , column = 6 , sticky = "nesw" )
SPI_Fond.delete ( 0 , "end" )
SPI_Fond.insert ( 0 , "white" )
TXT_Editeur.focus_set ( )
TKI_Principal.mainloop ( )
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de