⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ controles standards ⇨ Canvas
tkinter.Canvas ( ).create_line ( )
⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ controles standards ⇨ Canvas
tkinter.Canvas ( ).create_line ( )
DESCRIPTION.
Crée une ligne droite, brisée ou courbée dans une zone de dessin.
SYNTAXE.
CAN_Element = CAN_Toile.create_line ( *coordonnes , attribut1 = valeur , ... , attributn = valeur )
CAN_Element = ⇨ variable identifiant l'élément [ optionnel ]
CAN_Toile ⇨ instance quelconque de tkinter.Canvas ( ) [ OBLIGATOIRE ]
.create_line ( ) ⇨ appel de la méthode [ OBLIGATOIRE ]
*coordonnes ⇨ coordonnées des sommets de la ligne [ OBLIGATOIRE ]
attribut = valeur ⇨ attribut à modifier avec sa nouvelle valeur [ optionnel ]
REMARQUES.
*coordonnes doit être une suite d'au-moins de 4 int ( ) ou float ( ), pouvant être groupés dans un tuple ( ) ou une list ( ), représentant les coordonnées des sommets.
La collection de valeurs, *coordonnes, doit posséder un nombre d'éléments paires. Les valeurs de la collection ayant des index paires (0, 2, 4, ...) correspondent aux abscisses des sommets et les valeurs avec des index impaires (1, 3, 5, ...), correspondent aux ordonnées des sommets.
La quantité de valeurs dans la collection, *coordonnes, peut augmenter ou diminuer, en utilisant la méthode tkinter.Canvas ( ).coords ( ), en restant supérieur ou égal à 4 int ( ) et toujours en nombre paire, pour ajouter ou réduire le nombre de sommets de l'élément.
LISTE DES ATTRIBUTS DES LIGNES.
activedash = motif
Motif de la bordure quand le pointeur de la souris est sur l'élément (voir : Tutoriel de tkinter.Canvas ( )).
activefill = couleur
Couleur de l'élément quand le pointeur de la souris est sur lui.
activestipple = bitmap
Motif bitmap remplissant l'élément quand le pointeur de la souris est sur lui (voir : Tutoriel de tkinter.BitmapImage ( )).
activewidth = taille
Largeur de la bordure en pixel (1 par défaut) quand le pointeur de la souris est sur l'élément.
arrow = choix
Définit les extrémités terminées par une flèche : "first" début, "last" fin, "both" les deux ou None aucun (voir : exemple 2).
arrowshape = forme
Définit la forme de la flèche dans un tuple ( ) (voir : exemple 2).
capstyle = style
Définit le style de terminaison de fin de ligne : "butt" normal, "projecting" allongée , "round" arrondie (voir : exemple 3).
dash = motif
Motif du pointillées de la bordure de l'élément (voir : Tutoriel de tkinter.Canvas ( )).
dashoffset = ecart
Décalage de départ du motif de la bordure de l'élément (voir : Tutoriel de tkinter.Canvas ( )).
disableddash = motif
Motif de la bordure quand l'élément est désactivé (voir : Tutoriel de tkinter.Canvas ( )).
disabledfill = couleur
Couleur de l'élément quand il est désactivé.
disabledstipple = bitmap
Motif bitmap remplissant l'élément quand il est désactivé. Inactif si l'attribut disabledfill n'est pas définit.
disabledwidth = taille
Largeur de la bordure, en pixel, quand l'élément est désactivé.
fill = couleur
Couleur de l'élément (fill = "", transparent par défaut).
joinstyle = style
Définit le style de liaison entre les segments : "bevel" normal, "miter" pointue , "round" arrondie (voir : exemple 3).
offset = ecart
Décalage de départ entre les motifs de dégradé à l'intérieur de l'élément (voir : Tutoriel de tkinter.Canvas ( )).
smooth = style
Indique si les segments sont rectilignes, 0 par défaut, ou courbés, 1 (voir : exemple 4).
splinesteps = parties
Indique le nombre de divisions, de 1 à 12, utilisées entre 2 sommets quand smooth = 1 (voir : exemple 4).
state = etat
Définie l'état de l'élément : "normal" , "active" sous le pointeur, "disabled" désactivé, "hidden" invisible.
stipple = bitmap
Bitmap remplissant l'élément, Inactif si l'attribut fill n'est pas définit (voir : Tutoriel de tkinter.BitmapImage ( )).
tags = groupe
Liste des groupes auxquels appartient l'élément.
width = taille
Epaisseur de la ligne en pixel (1 par défaut).
EXEMPLE.
1. Création d'une ligne brisée.
import tkinter
def FNC_Afficher ( ) :
kcoordonnees = [ int ( kelement ) for kelement in CAN_Toile.coords ( CAN_Ligne ) ]
LAB_Sommets [ "text" ] = f"{ kcoordonnees }"
def FNC_Axes ( event ) :
kabscisse = ( SCA_Abscisse.get ( ) , 0 , SCA_Abscisse.get ( ) , 400 )
kordonnee = ( 0 , SCA_Ordonnee.get ( ) , 400 , SCA_Ordonnee.get ( ) )
CAN_Toile.coords ( CAN_Abscisse , *kabscisse )
CAN_Toile.coords ( CAN_Ordonnee , *kordonnee )
def FNC_Effacer ( ) :
CAN_Toile.coords ( CAN_Ligne , -1 , -1 , -1 , -1 )
FNC_Afficher ( )
def FNC_Epaisseur ( Q ) :
kepaisseur = float ( CAN_Toile.itemcget ( CAN_Ligne , "width" ) ) + Q
if kepaisseur < 0 : kepaisseur = 0
CAN_Toile.itemconfig ( CAN_Ligne , width = kepaisseur )
LAB_Trait [ "text" ] = f"{ int ( kepaisseur ) }"
def FNC_Tracer ( ) :
kcoordonnees = CAN_Toile.coords ( CAN_Ligne )
if sum ( kcoordonnees ) < 0 :
kcoordonnees.clear ( )
kcoordonnees.extend ( [ SCA_Abscisse.get ( ) , SCA_Ordonnee.get ( ) ] )
elif kcoordonnees [ 0 ] == kcoordonnees [ 2 ] and kcoordonnees [ 1 ] == kcoordonnees [ 3 ] :
kcoordonnees = kcoordonnees [ 0 : 2 ]
kcoordonnees.extend ( [ SCA_Abscisse.get ( ) , SCA_Ordonnee.get ( ) ] )
CAN_Toile.coords ( CAN_Ligne , *kcoordonnees )
FNC_Afficher ( )
TKI_Principal = tkinter.Tk ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
BUT_Tracer = tkinter.Button ( TKI_Principal , text = "Tracer" , command = FNC_Tracer )
BUT_Effacer = tkinter.Button ( TKI_Principal , text = "Effacer" , command = FNC_Effacer )
BUT_Plus = tkinter.Button ( TKI_Principal , text = "+ épais" , command = lambda : FNC_Epaisseur ( 1 ) )
BUT_Moins = tkinter.Button ( TKI_Principal , text = "- épais" , command = lambda : FNC_Epaisseur ( -1 ) )
SCA_Abscisse = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 399 , command = FNC_Axes )
SCA_Ordonnee = tkinter.Scale ( TKI_Principal , to = 399 , command = FNC_Axes )
LAB_Sommets = tkinter.Label ( TKI_Principal , relief = "ridge" , wraplength = 400 )
LAB_Trait = tkinter.Label ( TKI_Principal , text = "1" , relief = "ridge" , width = 2 )
CAN_Toile = tkinter.Canvas ( TKI_Principal , bg = "palegreen" , height = 400 , width = 400 )
CAN_Abscisse = CAN_Toile.create_line ( 0 , 0 , 0 , 0 )
CAN_Ordonnee = CAN_Toile.create_line ( 0 , 0 , 0 , 0 )
CAN_Ligne = CAN_Toile.create_line ( -1 , -1 , -1 , -1 )
SCA_Ordonnee.grid ( row = 0 , column = 0 , sticky = "nesw" )
CAN_Toile.grid ( row = 0 , column = 1 , columnspan = 6 , sticky = "nesw" )
SCA_Abscisse.grid ( row = 1 , column = 1 , columnspan = 6 , sticky = "nesw" )
LAB_Sommets.grid ( row = 2 , column = 1 , columnspan = 6 , sticky = "nesw" )
BUT_Tracer.grid ( row = 3 , column = 1 , sticky = "nesw" )
BUT_Effacer.grid ( row = 3 , column = 2 , sticky = "nesw" )
BUT_Plus.grid ( row = 3 , column = 3 , sticky = "nesw" )
LAB_Trait.grid ( row = 3 , column = 4 , sticky = "nesw" )
BUT_Moins.grid ( row = 3 , column = 5 , sticky = "nesw" )
BUT_Quitter.grid ( row = 3 , column = 6 , sticky = "nesw" )
SCA_Abscisse.set ( 200 )
SCA_Ordonnee.set ( 200 )
TKI_Principal.mainloop ( )
2. Définitions des flèches aux extrémités d'une ligne.
L'argument arrow permet de placer, ou d’ôter, des flèches aux extrémités de la ligne. avec : "first" début, "last" fin, "both" les deux ou None aucune.
L'argument arrowshape permet de modifier la forme des flèches. La forme des flèches est déterminée par un tuple ( ) de 3 int ( ) selon la forme ( recul , longueur , largeur ), où : recul corresponds à la distance de recul de la flèche vers l’intérieur de la ligne ; longueur corresponds à la longueur de la tête de flèche ; largeur corresponds à la largeur, hauteur, de la tête de flèche.
import tkinter
def FNC_Fleches ( *event ) :
CAN_Zone.itemconfig ( 1 , arrow = TKV_Choix.get ( ) )
def FNC_Tete ( event ) :
ktete = ( SCA_Recul.get ( ) , SCA_Longueur.get ( ) , SCA_Largeur.get ( ) )
CAN_Zone.itemconfig ( 1 , arrowshape = ktete )
TKI_Principal = tkinter.Tk ( )
TKV_Choix = tkinter.StringVar ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
SCA_Recul = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 250 , command = FNC_Tete )
SCA_Longueur = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 250 , command = FNC_Tete )
SCA_Largeur = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 250 , command = FNC_Tete )
RAD_Debut = tkinter.Radiobutton ( TKI_Principal , text = "first" , value = "first" , variable = TKV_Choix )
RAD_FIn = tkinter.Radiobutton ( TKI_Principal , text = "last" , value = "last" , variable = TKV_Choix )
RAD_Double = tkinter.Radiobutton ( TKI_Principal , text = "both" , value = "both" , variable = TKV_Choix )
RAD_Sans = tkinter.Radiobutton ( TKI_Principal , text = "None" , value = None , variable = TKV_Choix )
CAN_Zone = tkinter.Canvas ( TKI_Principal , bg = "white" , height = 180 , width = 300 )
CAN_Zone.create_line ( 50 , 90 , 250 , 90 , arrow = "both" , fill = "green" )
TKV_Choix.trace ( "w" , FNC_Fleches )
CAN_Zone.grid ( row = 0 , column = 0 , columnspan = 4 , sticky = "nesw" )
RAD_Debut.grid ( row = 1 , column = 0 , sticky = "nesw" )
RAD_FIn.grid ( row = 1 , column = 1 , sticky = "nesw" )
RAD_Double.grid ( row = 1 , column = 2 , sticky = "nesw" )
RAD_Sans.grid ( row = 1 , column = 3 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "Recul : " , justify = "left" , anchor = "se" , width = 12 ).grid ( row = 2 , column = 0 , sticky = "sew" )
SCA_Recul.grid ( row = 2 , column = 1 , columnspan = 3 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "Longueur : " , justify = "left" , anchor = "se" , width = 12 ).grid ( row = 3 , column = 0 , sticky = "sew" )
SCA_Longueur.grid ( row = 3 , column = 1 , columnspan = 3 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "Largeur : " , justify = "left" , anchor = "se" , width = 12 ).grid ( row = 4 , column = 0 , sticky = "sew" )
SCA_Largeur.grid ( row = 4 , column = 1 , columnspan = 3 , sticky = "nesw" )
BUT_Quitter.grid ( row = 5 , column = 0 , columnspan = 4 , sticky = "nesw" )
SCA_Recul.set ( 10 )
SCA_Longueur.set ( 10 )
SCA_Largeur.set ( 10 )
TKV_Choix.set ( "both" )
TKI_Principal.mainloop ( )
3. Modifier les extrémités de la ligne et les liaisons entre les segments.
L'attribut capstyle permet de modifier l'aspect des extrémités de la ligne avec : "butt" normal, "projecting" allongée , "round" arrondie. Tandis que l'attribut joinstyle modifie le style de liaison entre les segments avec "bevel" normal, "miter" pointue , "round" arrondie.
import tkinter
def FNC_Bouts ( *event ) :
CAN_Zone.itemconfig ( CAN_Zone_Ligne , capstyle = TKV_Bouts.get ( ) )
def FNC_Joints ( *event ) :
CAN_Zone.itemconfig ( CAN_Zone_Ligne , joinstyle = TKV_Joints.get ( ) )
TKI_Principal = tkinter.Tk ( )
TKV_Bouts = tkinter.StringVar ( )
TKV_Joints = tkinter.StringVar ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
RAD_Butt = tkinter.Radiobutton ( TKI_Principal , variable = TKV_Bouts , value = "butt" , text = "butt" )
RAD_Projecting = tkinter.Radiobutton ( TKI_Principal , variable = TKV_Bouts , value = "projecting" , text = "projecting" )
RAD_Round = tkinter.Radiobutton ( TKI_Principal , variable = TKV_Bouts , value = "round" , text = "round" )
RAD_Bevel = tkinter.Radiobutton ( TKI_Principal , variable = TKV_Joints , value = "bevel" , text = "bevel" )
RAD_Miter = tkinter.Radiobutton ( TKI_Principal , variable = TKV_Joints , value = "miter" , text = "miter" )
RAD_Rounds = tkinter.Radiobutton ( TKI_Principal , variable = TKV_Joints , value = "round" , text = "round" )
CAN_Zone = tkinter.Canvas ( TKI_Principal , bg = "lightyellow" , height = 300 , width = 400 )
CAN_Zone_Ligne = CAN_Zone.create_line ( 50 , 40 , 150 , 260 , 250 , 40 , 350 , 260 , width = 25 , fill = "orange" )
TKV_Bouts.trace ( "w" , FNC_Bouts )
TKV_Joints.trace ( "w" , FNC_Joints )
CAN_Zone.grid ( row = 0 , column = 0 , columnspan = 4 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "Bouts :" ).grid ( row = 1 , column = 0 , pady = 6 )
RAD_Butt.grid ( row = 1 , column = 1 , sticky = "w" )
RAD_Projecting.grid ( row = 1 , column = 2 , sticky = "w" )
RAD_Round.grid ( row = 1 , column = 3 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Joints").grid ( row = 2 , column = 0 , pady = 6 )
RAD_Bevel.grid ( row = 2 , column = 1 , sticky = "w" )
RAD_Miter.grid ( row = 2 , column = 2 , sticky = "w" )
RAD_Rounds.grid ( row = 2 , column = 3 , sticky = "w" )
BUT_Quitter.grid ( row = 3 , column = 0 , columnspan = 4 , padx = 6 , pady = 6 , sticky = "nesw" )
TKV_Bouts.set ( "butt" )
TKV_Joints.set ( "round" )
TKI_Principal.mainloop ( )
4. Segmentation manuelle ou automatique d'une ligne.
L'attribut smooth indique si la ligne est constituée de segments avec smooth = True ou non avec smooth = False.
Quand smooth = True, tkinter ne tient compte que des sommets de début et de fin pour tracer la ligne, les sommets intermédiaires qui sont présents sont ignorés, et l'attribut splineteps = nombre indique, alors, le nombre de segments utilisés pour tracer cette ligne. nombre doit être un int ( ) entre 1 et 12, et le nombre de segments est égal à [ ( nombre - 1 ) x 2 ] + 1. Par exemple si splineteps = 5 , la ligne sera fractionnée en [ ( 5 - 1 ) x 2 ] + 1 = 9 parties.
Quand smooth = False, la ligne passe par tous les sommets intermédiaires qui sont présents dans sa définition, et l'attribut splineteps = nombre est ignoré,
import tkinter
def FNC_Courbe ( *event ) :
CAN_Zone.itemconfig ( CAN_Zone_Ligne , splinesteps = SCA_Partie.get ( ) , smooth = TKV_Courbe.get ( ) )
TKI_Principal = tkinter.Tk ( )
TKV_Courbe = tkinter.BooleanVar ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
CKB_Courbe = tkinter.Checkbutton ( TKI_Principal , variable = TKV_Courbe , text = "Courber" , command = FNC_Courbe )
SCA_Partie = tkinter.Scale ( TKI_Principal , orient = "horizontal" , from_ = 1 , to = 12 , length = 300 , command = FNC_Courbe )
CAN_Zone = tkinter.Canvas ( TKI_Principal , bg = "palegreen" , height = 300 , width = 400 )
CAN_Zone_Ligne = CAN_Zone.create_line ( 50 , 40 , 150 , 260 , 250 , 40 , 350 , 260 , width = 5 , fill = "green" )
CAN_Zone.grid ( row = 0 , column = 0 , columnspan = 2 , sticky = "nesw" )
CKB_Courbe.grid ( row = 1 , column = 0 , pady = 25 , sticky = "sw" )
SCA_Partie.grid ( row = 1 , column = 1 , pady = 25 , sticky = "sew" )
BUT_Quitter.grid ( row = 2 , column = 0 , columnspan = 2 , sticky = "nesw" )
TKV_Courbe.set ( False )
TKI_Principal.mainloop ( )
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de