Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Positionnement de widgets avec la méthode place

Votre première fenêtre Tkinter Positionnement avec la méthode pack


Accès rapide :
Utilisation de la méthode place
Utilisation de sous-conteneurs

Un aspect très important lors de la réalisation d'une interface graphique, consiste à disposer intelligemment vos widgets dans la fenêtre. Pour ce faire, plusieurs stratégies de positionnement peuvent être utilisées. La plus simple consiste à placer vos widgets au pixel prêt dans la fenêtre. Mais attention, en cas de changement de taille (on dit aussi de géométrie), vos widgets ne seront pas repositionnés (contrairement aux deux autres stratégies que nous allons étudier ensuite).

Utilisation de la méthode place

Pour positionner un widget au pixel prêt dans son conteneur (dans notre cas, la fenêtre), il faut invoquer la méthode place.

la méthode place est disponible sur n'importe quel widget. Mais en réalité, c'est la classe Place qui porte cette méthode et par le jeu subtil de l'héritage cette méthode est transmise à toutes les classes de widgets.

Voici un exemple simple d'utilisation.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
#!/usr/bin/python3

from tkinter import Tk, Button, Label


# On définit une classe qui dérive de la classe Tk (la classe de fenêtre).
class MyWindow(Tk):

    def __init__(self):
        # On appelle le constructeur parent
        super().__init__()

        # On positionne un premier label en (10, 10)
        first_label = Label(self, text="Label (10, 10)", fg="white", bg="#FF00FF")
        first_label.place(x=10, y=10)

        # Puis on positionne un second label en (50, 50)
        second_label = Label(self, text="Label (50, 50)", fg="white", bg="green")
        second_label.place(x=50, y=50)

        # Enfin on positionne un bouton en (90, 90)
        button = Button(self, text="Button (90, 90)", fg="black", bg="blue")
        button.place(x=90, y=90)

        # On dimensionne la fenêtre (300 pixels de large par 200 de haut).
        self.geometry("300x200")

        # On ajoute un titre à la fenêtre
        self.title("Hello")


# On crée notre fenêtre et on l'affiche
window = MyWindow()
window.mainloop()
Exemple de positionnement de widgets avec la méthode place.
vous l'aurez constaté, les paramètres x et y ne sont pas des paramètres positionnels. Il est donc obligatoire de les nommer dans l'appel à la méthode place. Il en va de même pour certains paramètres des constructeurs de vos widgets.

Et voici le résultat affiché par cet exemple de code Tkinter.

Positionnement des widgets via la méthode place.
pensez à redimensionner la fenêtre. Vous constaterez que les widgets restent placés à ces coordonnées.

Utilisation de sous-conteneurs

Une fenêtre graphique (une instance de la classe Tk) est un conteneur : elle peut contenir des widgets. Mais il existe un type de widgets particulier : la classe Frame. Un tel widget est aussi un conteneur. Cela sous-entend qu'il est possible d'y injecter des widgets.

L'exemple suivant place deux composants de type Frame à l'intérieur de la fenêtre. Ils auront tous les deux une taille de 150 pixels par 200, soit la moitié de la taille de la fenêtre. Le composant de gauche reçoit à son tour deux widgets de type Label alors que celui de droite reçoit un widget de type Button.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
#!/usr/bin/python3

from tkinter import Tk, Button, Label, Frame


# On définit une classe qui dérive de la classe Tk (la classe de fenêtre).
class MyWindow(Tk):

    def __init__(self):
        # On appelle le constructeur parent
        super().__init__()

        # On définit un premier container à gauche de la fenêtre
        left_container = Frame(self, width=150, height=200)
        left_container.place(x=0, y=0)

        # On positionne un premier label en (10, 10) dans le conteneur de gauche.
        first_label = Label(left_container, text="Label (10, 10)", fg="white", bg="#FF00FF")
        first_label.place(x=10, y=10)

        # Puis on positionne un second label en (50, 50) dans le même conteneur.
        second_label = Label(left_container, text="Label (50, 50)", fg="white", bg="green")
        second_label.place(x=50, y=50)

        # On définit un premier container à gauche de la fenêtre
        right_container = Frame(self, width=150, height=200, relief='raised', borderwidth=5)
        right_container.place(x=150, y=0)

        # On positionne un bouton en (10, 10) dans le conteneur de droite.
        button = Button(right_container, text="Button (10, 10)")
        button.place(x=10, y=10)

        # On dimensionne la fenêtre (300 pixels de large par 200 de haut).
        self.geometry("300x200")

        # On ajoute un titre à la fenêtre
        self.title("Hello")


# On crée notre fenêtre et on l'affiche
window = MyWindow()
window.mainloop()
Utilisation de conteneurs de type Frame
il est possible de contrôler le détourage d'un Frame, comme le montre l'exemple ci-dessus avec le widget right_container.

Et voici le résultat produit par cet exemple.

Positionnement des widgets dans un Frame via la méthode place.


Votre première fenêtre Tkinter Positionnement avec la méthode pack