# Documentation : http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html import tkinter from PIL import ImageTk # Si on clique dans la fenêtre, on verra les coordonnées s'afficher dans le terminal def click(event): print("clic souris : ", event.x, event.y) # L'application sera contenue dans un objet qui hérite de /Frame/ (un conteneur). # Cette frame contiendra un /Canvas/ qui contiendra des objets graphique. # On peut faire ce programme *sans* utiliser de /Frame/, mais directement le # canvas. Cependant, si par la suite on souhaite ajouter d'autres éléments graphiques # ce sera tout prêt... class Fenetre(tkinter.Frame): def __init__(self, parent): # Initialiseur de la classe parente : super().__init__(parent) # Titre de l'application : parent.title("Example graphique Tkinter avec classe") # Disposition de la Frame (dans la fenêtre application). La frame va prendre toute la place # disponible dans la fenêtre, même si on change la taille de la fenêtre self.pack(fill='both', expand=1) # On crée un canevas de taille 400x300 dans la Frame /self/ self.canvas = tkinter.Canvas(self, width=300, height=400, background="grey") # Le canevas est "packé" dans sa fenêtre en laissant une petite bordure de taille 8 self.canvas.pack(padx=8, pady=8)# Ajouter fill='both', expand=1 pour voir... self.image = None # initialisation propre d'un attribut utilisé plus loin # On dessine self.draw_board() # On demande à associer la callback /click/ à l'événement // self.canvas.bind("", click) def draw_board(self): # On trace un rectangle rouge : coin hg 10,10, coin bd 100,20 self.canvas.create_rectangle(10, 10, 100, 30, fill="#ff0000") # Puis un bleu self.canvas.create_rectangle(80, 20, 200, 60, fill="#0000ff", outline="#00ff00") # On trace une ligne violette self.canvas.create_line(0, 0, 200, 300, fill="#ff00ff") # On charge l'image self.image = ImageTk.PhotoImage(file="python.png") # Et on l'affichge, les coordonnées sont celles du centre (anchor="c") self.canvas.create_image(128,128, image=self.image, anchor="c") # Attention, on ne peut pas utiliser de variable locale pour l'image car après avoir # donné l'ordre d'affichage /create_image/ Tk doit pouvoir continuer à disposer des données. # Or les variables locales sont libérées (et l'image effacée) à la sortie de la fonction # qui les contient. C'est pourquoi on utilise ici un attribut de classe. self.image a ainsi # la même durée de vie que l'objet global /gui/ (voir plus bas) def main(): # Création de l'application root = tkinter.Tk() # Ajout des éléments graphiques gui = Fenetre(root) # Boucle des événements root.mainloop() if __name__ == "__main__": main()