Bonjour,

C'est un peu la question de la honte, mais bon...

Je ne comprends pas le principe de l'utilisation de l'option weight de la méthode columnconfigure dans le cas où l'on veut forcer l'espace relatif de chaque colonne dans un Frame par exemple.

J'ai trouvé de la doc qui est en fait la traduction de ce lien : http://infohost.nmt.edu/tcc/help/pubs/tkinter.pdf

Il y est dit :
Pour faire une colonne ou une rangée étirable, utilisez cette option et fournissez
une valeur qui donne le poids relatif de cette colonne ou rangée en distribuant l'espace supplémentaire. Par exemple, si un widget w contient une configuration de grille, ces lignes distribueront 3/4 de l'espace supplémentaire à la première colonne et 1/4 à la deuxième colonne :
w.columnconfigure(0, weight=3)
w.columnconfigure(1, weight=1)
Eventuellement je peux comprendre que l'on divise le frame en 4 "morceaux", on en affecte 3 à la première colonne et 1 à la dernière.

Mais dans le cas où l'on veut trois colonnes égales? On divise en 3 et on affecte 1 à chaque colonne? J'ai essayé, cela ne marche pas. J'obtiens des zones étirables, mais pas de largeur égale.
La finalité est pour avoir trois boutons dans un frame qui on la même largeur quelque soit ce qui est au dessus et qui détermine la largeur de la fenêtre de l'application.

Voici le code de l'appli. J'ai juste laissé les classe qui permettent l'affichage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#-*- coding : utf8 -*-
 
#importation de fonctions externes
from tkinter import * #importation du module graphique tkinter sous python 3. /!\ a ne pas confondre avec Tkinter avec python 2
import time#importation module time pour la mesure du tps
 
#import re#importation du module re pour travailler avec les expression régulière
 
 
# *** DEFINITION LOCAL DE CLASSE
class LabelRb(Label):#on fait hériter cette classe de la classe Label
  """
  classe pr créer des label identique d'aspect
  """
  def __init__(self, parent, contenu, lig, col):#methode constructeur
    Label.__init__(self, parent)#on appel le constructeur de la classe Label
    self.grid(row=lig, column=col)
    self.configure(text=contenu, bg="#EED8AE", fg="blue")
 
 
class EntryRb(Entry):#on fait hériter cette classe de la classe Entry
  """
  classe pour crée des Entry identique d'aspect et de propriété notament pr le clic de souris
  """
 
  def __init__(self, parent, contenu,lig, col):#methode constructeur
    #print(parent.geometry)
    Entry.__init__(self, parent)#on appel le constructeur de la classe Entry à qui on affecte l'objet crée ds nouvelle classe issue de l'héritage. On obtient un Entry que l'on peut adapter à nos besoins.
    self.grid(row=lig, column=col, sticky=E+W)#on applique la méthode de positionnement grid() à self. Ceci possible car self et par défaut un Entry
    self.config(width="7")
    self.insert(0, contenu)#on insert par défaut la valeur 0 ds tous les Entry instancié.
    self.bind("<Button-1>", lambda event=None: self.deleteEntry())#au clic gauche, on appel la méthode deleteEntry qui met à vide l'Entry.
    #print(self.master.winfo_height)
    #print("qqc")
 
  def deleteEntry(self):#méthode qui vide l'entry. On donne en argument self, bien qu'à l'appel de la méthode on n'en donne pas.
    self.delete(0,END)#on efface le contenu de l'Entry du début (indice 0), jusqu'au dernier indice (END, END permet de connaitre cet indice ss calcul)
 
 
class ButtonRb(Button):
  """
  classe pr créer des Button identique d'aspect
  """
  def __init__(self, parent, contenu, lig, col):#methode constructeur.
    #parent=le contenant parent, contenu=le label du bouton, lig et col=position du widget avec grid(), action=commad à executer par button
    Button.__init__(self, parent)#on appel le constructeur de la classe Button
    self.config(text=contenu, bg="#EED8AE", fg="blue")#ligne qui permet d'ajouter des attribut à l'objet
    self.grid(row=lig, column=col, sticky=E+W, ipadx=0, ipady=0)#on applique la méthode de positionnement grid() à self.
 
 
fenPrin=Tk()
fenPrin.title("Compte à rebours")
fenPrin.configure(bg="#EED8AE")
 
#LIGNE 0
entIntitule=EntryRb(fenPrin, "Titre du compte à rebours", "0", "0")
 
 
#LIGNE 1
#FRAME frmTps . Frame contenant les widget relatif au temps
frmTps=Frame(fenPrin, bg="#EED8AE")
frmTps.grid(row="1", column="0")
 
#--frmTps LIGNE 0
lblHeure=LabelRb(frmTps, "Heure", "0", "0")#instanciation des Label
lblMin=LabelRb(frmTps, "Minute", "0", "1")
lblSec=LabelRb(frmTps, "Seconde", "0", "2")
lblTitreDec=LabelRb(frmTps, "Temps restant", "0", "3")
 
#--frmTps LIGNE 1
entHeure=EntryRb(frmTps, "0", "1", "0")#instanciation des Entry
entMin=EntryRb(frmTps, "0", "1", "1")
entSec=EntryRb(frmTps, "0", "1", "2")
lblAffDec=LabelRb(frmTps, "00 00 00", "1", "3")#Label d'affichage du décompte
 
 
#LIGNE 2
#FRAME frmBt. Frame contenant les boutons
frmBt=Frame(fenPrin, bg="#EED8AE")
frmBt.grid(row="2", column="0", sticky=E+W)
frmBt.columnconfigure(0, weight=3)
frmBt.columnconfigure(1, weight=3)
frmBt.columnconfigure(2, weight=0)
 
#création de la liste contenant les Entry des H M N
lstTps=list()#instantiation de la liste
lstTps=[entHeure, entMin, entSec]
 
 
#--frmBt LIGNE 0
btArret=ButtonRb(frmBt, "Quitter", "0","0")
btStart=ButtonRb(frmBt, "Départ", "0","1")
btReset=ButtonRb(frmBt, "Mise à zéro", "0","2")
 
 
fenPrin.mainloop()#la fenêtre principale est en attente d'action
La partie qui utilise columnconfigure est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
#LIGNE 2
#FRAME frmBt. Frame contenant les boutons
frmBt=Frame(fenPrin, bg="#EED8AE")
frmBt.grid(row="2", column="0", sticky=E+W)
frmBt.columnconfigure(0, weight=3)
frmBt.columnconfigure(1, weight=3)
frmBt.columnconfigure(2, weight=0)