IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Incrémentation du padx


Sujet :

Tkinter Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut Incrémentation du padx
    Bonjour,

    j'ai quelques boutons alignés côte à côte. J'incrémente le padx des boutons jusqu'à ce que leur largeur additionnée soit égale à la largeur de la fenêtre.
    Tout marche bien, j'obtiens ce que je veux.


    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
    from tkinter import *
    root=Tk()
    Buts={}
    myLargeurTot=[0]
     
    L = root.winfo_screenwidth()
    H = root.winfo_screenheight()
    root.minsize(L,H)
    n=11
     
     
    def callback() :
        #print(str(myLargeurTot[1]))
        fin=0    
        while fin<1 :
                myPadx = str(Buts[0,0].cget("padx"))
                myPadx2=int(myPadx)+1 
                myWidth0=str(myLargeurTot[1])
                myWidth=int(myWidth0)
                for r in range(1): 
                   for c in range(n):
                       if myWidth<L :
                          myWidth=myWidth-Buts[r,c].winfo_reqwidth() 
                          Buts[(r,c)].config(padx=myPadx2)
                          myWidth=myWidth+Buts[r,c].winfo_reqwidth()
                          myLargeurTot[1]=myWidth
                       else :
                          fin=1
                          break
                #root.mainloop()
        for r in range(1): 
                for c in range(n):
                       print(Buts[r,c].winfo_reqwidth())                
     
    for r in range(1):
          myWidth=0
          for c in range(n):
                Buts[(r,c)]=Button(root,text='%s/%s'%(r,c),borderwidth=10, command=callback)
                Buts[r,c].grid(row=r,column=c)
                myWidth=myWidth+Buts[r,c].winfo_reqwidth()
          myLargeurTot.append(myWidth)      
     
    root.mainloop()
    Par contre, dans le code ci-dessous où j'ai 2 boutons l'un en dessous de l'autre, j'arrive pas, en cliquant sur l'un des boutons, à incrémenter le padx du 2ème bouton jusqu'à ce qu'il égale ou dépasse la largeur du premier bouton. Pourrier-vous m'aider svp? Je crois que c'est pas mainloop qu'il faut utiliser dans la boucle while.

    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
    from tkinter import *
     
    master = Tk()
    L = 1000#master.winfo_screenwidth()
    H = 260#master.winfo_screenheight()
     
    master.minsize(L,H)
     
    def callback() :
            largMax=180
            maLargB=b.winfo_reqwidth()
            maLargC=c.winfo_reqwidth()
            myPad0 = str(c.cget("padx"))
            #print("myPad0 = " +str(myPad0))
            while maLargC<maLargB :                
               myPadx=int(myPad0)+1
               c.config(padx=myPadx)
               #print("maLargC = " +str(maLargC))
               mainloop()   
     
    b = Button(master, text="Taille minimale à obtenir", width=60, command=callback)
    b.pack()
     
    c = Button(master, text="---", width=56, command=callback)
    c.pack()
    mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Citation Envoyé par Arsene12 Voir le message
    Pourrier-vous m'aider svp? Je crois que c'est pas mainloop qu'il faut utiliser dans la boucle while.
    Déjà pourquoi faire une boucle alors que connaissant la différence maLargC<maLargB inutile de faire une boucle qui va incrémenter de 1 à chaque itération.

    De plus, si vous écrivez une boucle while condition, comme while maLargC<maLargB, c'est que vous savez que la condition sera fausse (un jour) histoire de sortir de la boucle.
    Ce qui dans votre cas, passe par la mise à jour par au moins une des deux variables dans le corps de la boucle.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Déjà pourquoi faire une boucle alors que connaissant la différence maLargC<maLargB inutile de faire une boucle qui va incrémenter de 1 à chaque itération.
    - W
    Les width m'ont permis de constater que l'unité de mesure n'était pas la même pour padx et pour width. Sinon en 2 clic, le 2ème bouton passerai de 56 à 60, la taille du 1er bouton.

    Citation Envoyé par wiztricks Voir le message
    De plus, si vous écrivez une boucle while condition, comme while maLargC<maLargB, c'est que vous savez que la condition sera fausse (un jour) histoire de sortir de la boucle.
    Ce qui dans votre cas, passe par la mise à jour par au moins une des deux variables dans le corps de la boucle.

    - W
    Après avoir élargi le bouton en augmentant le padx, je mets donc à jour la variable maLargC en rajoutant maLargC=c.winfo_reqwidth() dans la boucle while, mais ça n'a aucun effet :

    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
    from tkinter import *
     
    master = Tk()
    L = 1000#master.winfo_screenwidth()
    H = 260#master.winfo_screenheight()
     
    master.minsize(L,H)
     
    def callback() :
            largMax=180
            maLargB=b.winfo_reqwidth()
            maLargC=c.winfo_reqwidth()
            myPad0 = str(c.cget("padx"))
            print("myPad0 = " +str(myPad0))
            while maLargC<maLargB :                
               myPadx=int(myPad0)+1
               c.config(padx=myPadx)
               maLargC=c.winfo_reqwidth()
               print("maLargC = " +str(maLargC))
               mainloop() 
     
    b = Button(master, text="Taille minimale à obtenir", width=60, command=callback)
    b.pack()
     
    c = Button(master, text="---", width=56, command=callback)
    c.pack()
    mainloop()
    Si dans la boucle while je remplace mainloop() par Tk.update_idletasks(c), ça marche pas non plus.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Les width m'ont permis de constater que l'unité de mesure n'était pas la même pour padx et pour width. Sinon en 2 clic, le 2ème bouton passerai de 56 à 60, la taille du 1er bouton.
    Pour faire çà, on prend une Frame de taille fixe et on demande à .pack de forcer le Button à occuper la taille disponible... et voilà.

    Citation Envoyé par Arsene12 Voir le message
    Après avoir élargi le bouton en augmentant le padx, je mets donc à jour la variable maLargC en rajoutant maLargC=c.winfo_reqwidth() dans la boucle while,
    Certes mais winfo_reqwidth, c'est la taille initiale, c'est pour çà qu'il y a aussi winfo_width().
    Si vous voulez faire des choses compliquées, il faut avoir la patience de lire et comprendre la documentation et pas resservir des trucs qui ont fait tomber en marche d'autres bouts de codes: si vous ne comprenez pas pourquoi çà fonctionne, vous ne savez pas dans quelles conditions çà pourra fonctionner! Exemple:
    Citation Envoyé par Arsene12 Voir le message
    Si dans la boucle while je remplace mainloop() par Tk.update_idletasks(c), ça marche pas non plus.
    Ce n'est pas la première fois que vous utilisez .update ou .update_idletasks!
    Vous devriez savoir pourquoi vous l'utilisez et être confiant que si çà ne marche pas, le soucis est ailleurs dans votre code et que .mainloop n'ayant aucune chance de fonctionner dans ce cas, c'est même pas la peine d'essayer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Certes mais winfo_reqwidth, c'est la taille initiale, c'est pour çà qu'il y a aussi winfo_width().
    - W
    Si je mets winfo_width() à la place de winfo_reqwidth(), ça ne règle pas le problème. Le while agit comme un if. Je comprends pas pourquoi. Ça m'aiderait beaucoup si vous aviez l'explication et la solution. L'action à réaliser n'est pas si compliquée. Un autre langage que python pourrait faire ça simplement.

    Quand je clique sur la croix, le shell me renvoie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1702, in __call__
        return self.func(*args)
      File "C:\Users\Desktop\monFichier.py", line 17, in callback
        c.config(padx=myPadx)
      File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1482, in configure
        return self._configure('configure', cnf, kw)
      File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1473, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".!button2"

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Je comprends pas pourquoi. Ça m'aiderait beaucoup si vous aviez l'explication et la solution.
    L'explication est que vous voulez faire des choses compliquées en les rendant encore plus compliquées.

    Si je devais faire çà, j'écrirai:
    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
    from tkinter import *
     
    master = Tk()
    L = 1000#master.winfo_screenwidth()
    H = 260#master.winfo_screenheight()
     
    master.minsize(L,H)
     
    def callback() :
            B =int(b.winfo_width())
            C =int(c.winfo_width())
            P = int(str(c.cget("padx")))
            P += (B - C) // 2
            c.config(padx=P)
     
    b = Button(master, text="Taille minimale à obtenir", width=60, command=callback)
    b.pack()
     
    c = Button(master, text="---", width=56, command=callback)
    c.pack()
    mainloop()
    Vous voyez un while?, un update?
    çà récupère les dimensions, ajoute la moitié de la différence à l'ancien padx,... et voilà.
    Simple non?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    L'explication est que vous voulez faire des choses compliquées en les rendant encore plus compliquées.
    - W
    Effectivement j'aurai du penser que pour un seul bouton, on pouvait se dispenser d'utiliser while. Mais c'est une rangée de plusieurs boutons de longueurs variables que je voudrai. C'est pour ça que je dois utiliser une boucle while qui incréme le padx de chaque bouton jusqu'à ce que la largeur voulue soit atteinte.

    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
    from tkinter import *
     
    master = Tk()
    L = 500#master.winfo_screenwidth()
    H = 260#master.winfo_screenheight()
     
    #master.minsize(L,H)
     
    def callback() :
            B =int(b.winfo_width())
            C =int(c.winfo_width())
            R =int(r.winfo_width())
            D =int(d.winfo_width())
            P = int(str(c.cget("padx")))
            P += (B - C) // 2
            c.config(padx=P)
     
    b = Button(master, text="Taille à obtenir", width=100, bg="yellow", command=callback)
    b.pack(side="top")
     
    r = Button(master, text="---", command=callback)
    r.pack(side="left")
     
    c = Button(master, text="---", command=callback)
    c.pack(side="left")
     
    d = Button(master, text="---", command=callback)
    d.pack(side="left")
     
    e = Button(master, text="---", command=callback)
    e.pack(side="left")
     
    mainloop()

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Mais c'est une rangée de plusieurs boutons de longueurs variables que je voudrai.
    "pack" sait déjà faire çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import tkinter as tk
    import random
     
    root = tk.Tk()
     
    frame = tk.Frame(root, bg='grey')
    frame.pack()
     
    for i in range(5):
        count = random.randint(1, 10)
        text = str(i) * count
        tk.Label(frame, text=text, bg='green').pack(expand=1, fill='x')
     
    tk.mainloop()
    après, si vous préférez taper n'importe quoi sur un clavier plutôt que de prendre le temps d'apprendre à utiliser les outils qui font déjà des tas de trucs pour vous, c'est votre problème.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    "pack" sait déjà faire çà
    - W
    Excusez-moi, vous m'avez mal compris. J'ai bien dit une rangée de boutons et non une colonne. C'est pour ça qu'il me faut absolument incrémenter le padx.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Excusez-moi, vous m'avez mal compris. J'ai bien dit une rangée de boutons et non une colonne. C'est pour ça qu'il me faut absolument incrémenter le padx.
    Vous avez encore changé de problème?

    Rangée ou colonne, ce sont "grid" ou "pack" qui distribuent l'espace disponible sur les autres widgets.
    Après, il faut apprendre à les utiliser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Vous avez encore changé de problème?

    Rangée ou colonne, ce sont "grid" ou "pack" qui distribuent l'espace disponible sur les autres widgets.
    Après, il faut apprendre à les utiliser.

    - W
    Le problème on peut le visualiser dans le code ci-dessous, en cliquant sur le bouton OK puis sur un bouton jaune. J'obtiens pas ce que je veux mais je pense être sur la bonne voie :


    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
     
    from tkinter import *
    from tkinter import ttk
     
    master = Tk()
    L = master.winfo_screenwidth()
    H = master.winfo_screenheight()
    bout=[]
     
    master.minsize(L,H)
    #master.geometry("320x600")
     
    motsManquants=[]
     
    class MyButton(Button):
     
        def on_click(self):
     
     
         for k in range(1,3) :
           largMax = 300#int(b.winfo_width())
           fin=0  
           maLargTot=0
           while fin==0:#maLargTot<largMax :                   
                       maLargTot=0
                       for el in bout :   # on récupère le padx du premier élément et la largeur de la totalité des boutons sur toute la ligne
                            #print(el[0])
                            if el[1]==k :
                                myPad0 = str(el[0].cget("padx"))
                                myPadx=int(myPad0)+1
                                maLargTot=maLargTot+el[0].winfo_reqwidth()
                       #print("myPad0 = " +str(myPadx))
                       for el in bout :                      
                          if el[1]==k and maLargTot<largMax :
                                 #print(str(el[1])+ ":" +str(k))
                                 maLargTot=maLargTot-el[0].winfo_reqwidth()
                                 el[0].config(padx=myPadx)
                                 maLargTot=maLargTot+el[0].winfo_reqwidth()
                                 #print("maLargTot = " +str(maLargTot))
                                 #print("largMax = " +str(largMax))
                                 #print("k = " +str(k)) 
                                 #print(str(el[0].winfo_reqwidth()))
                                 #print("maLargTot1 = " +str(maLargTot))
                                 #print(str(el[2]))
                          elif el[1]==k and maLargTot>=largMax :
                                 #print(str(el[1])+ ":" +str(k))
                                 #print("maLargTot = " +str(maLargTot))
                                 #print("largMax = " +str(largMax))
                                 #print(" Bouton N° "+str(el[5])+ " : " + str(el[0].winfo_reqwidth()))
                                 #print("k = " +str(k))                             
                                 fin=1
                                 break
     
    def callback() :
        conteneur = Frame(master, bg='yellow')
        conteneur.pack() 
        x = 0
        pack = True
        i = 0
        j = 0
        n = 0  
     
        texte = [("HG","Et","GN,","AP","FC"),("MB","je","GN,","AP","FC"),("OJ","me","GN,","AP","FC"),("KI","suis","GN,","AP","FC"),("OR","demandé","GN,","AP","FC")]
        for mot2 in texte :            
                n = n+1
                mot00 = mot2[3]
                mot01 = mot2[4]
                if mot00 == "AP" and mot01 == "FC":
                    mot = mot2[1]
                    if not x :
                        frame = Frame(conteneur, bg='grey', width=master.winfo_screenwidth(), height=30)
                        frame.pack()
                        x=1
                        i += 1
     
                    # On ne définit pas le parent
     
                    w = MyButton(text=mot, textvariable=str(n), font='arial 16', fg="black", bg="yellow")#, command=lambda j=n: OnButton2Click(j))                    
                    w['command'] = w.on_click
                    w.pack(in_=frame, side='left')
     
                    w1=(w, n, mot)
                    bout.append(w1)
     
     
     
    b = Button(master, text="OK", width=120, command=callback)
    b.pack()
     
    mainloop()
    Sauriez-vous me dire ce qui va pas, svp?

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Sauriez-vous me dire ce qui va pas, svp?
    "pack" et "grid" font déjà cela, je ne vais pas me fatiguer à essayer de comprendre dans quels pièges vous êtes tombé en essayant de coder çà par vous même...
    Apprenez à utiliser les fonctionnalités de base avant de vouloir prétendre faire mieux!

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    "pack" et "grid" font déjà cela, je ne vais pas me fatiguer à essayer de comprendre dans quels pièges vous êtes tombé en essayant de coder çà par vous même...
    Apprenez à utiliser les fonctionnalités de base avant de vouloir prétendre faire mieux!

    - W
    Ce que je fais n'est pas bien compliqué. Il me semblait avoir le bon code mais y'a un problème. Apparemment il vient de la fonction winfo_width(). Lorsque je clique sur un bouton jaune, après avoir cliqué sur le bouton OK, le bloc des boutons jaunes n'est pas égal en largeur au bouton OK. Je pensais qu'avec largMax = b.winfo_width() ça devait marcher. En plus de ça, si je remplace winfo_reqwidth par winfo_width, le programme se bloque. Voyez vous-même :

    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
     
    from tkinter import *
    from tkinter import ttk
     
    master = Tk()
    L = master.winfo_screenwidth()
    H = master.winfo_screenheight()
    bout=[]
     
    master.minsize(L,H)
     
    motsManquants=[]
     
    class MyButton(Button):
     
        def on_click(self):        
     
         for k in range(1,6) :
           print(int(b.winfo_width()))
           largMax = 300#b.winfo_width()
           fin=0  
           maLargTot=0
           while fin==0:#maLargTot<largMax :                   
                       maLargTot=0
                       for el in bout :   
                            if el[1]==k :                # on récupère la largeur de la totalité des boutons sur toute la ligne
                                maLargTot=maLargTot+el[0].winfo_reqwidth()
                       for el in bout :                      
                          if el[1]==k and maLargTot<largMax :
                                 myPad0 = str(el[0].cget("padx"))   #on récupère le padx
                                 myPadx=int(myPad0)+1
                                 maLargTot=maLargTot-el[0].winfo_reqwidth()
                                 el[0].config(padx=myPadx)
                                 maLargTot=maLargTot+el[0].winfo_reqwidth()
                          elif el[1]==k and maLargTot>=largMax :                          
                                 fin=1
                                 break
     
     
    def callback() :
        conteneur = Frame(master, bg='yellow')
        conteneur.pack() 
        x = 0
        pack = True
        i = 0
        j = 0
        n = 0  
     
        texte = [("HG","Et","GN,","AP","FC"),("MB","je","GN,","AP","FC"),("OJ","me","GN,","AP","FC"),("KI","suis","GN,","AP","FC"),("OR","demandé","GN,","AP","FC")]
        for mot2 in texte :            
                n = n+1
                mot00 = mot2[3]
                mot01 = mot2[4]
                if mot00 == "AP" and mot01 == "FC":
                    mot = mot2[1]
                    if not x :
                        frame = Frame(conteneur, bg='grey', width=master.winfo_screenwidth(), height=30)
                        frame.pack()
                        x=1
                        i += 1
     
                    # On ne définit pas le parent
     
                    w = MyButton(text=mot, textvariable=str(n), font='arial 16', fg="black", bg="yellow")#, command=lambda j=n: OnButton2Click(j))                    
                    w['command'] = w.on_click
                    w.pack(in_=frame, side='left')
     
                    w1=(w, n, mot)
                    bout.append(w1)
     
     
     
    b = Button(master, text="OK", width=120, command=callback)
    b.pack()
     
    mainloop()
    Pourquoi quand je fais print, j'obtiens 850 au lieu de 120?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import *
     
    master = Tk()
     
    def on_click():        
         print(int(b.winfo_reqwidth()))
     
     
    b = Button(master, text="OK", width=120, command=on_click)
    b.pack()
     
    mainloop()

  14. #14
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Pourquoi quand je fais print, j'obtiens 850 au lieu de 120?
    https://www.developpez.net/forums/d1.../#post10555316

    Mais en consultant la documentation tkinter, tu aurais pu également le lire, c'est un réflexe à avoir de consulter les documentations, d'autant qu'une version de cette doc a été traduite en français, si tu as un peu de mal avec l'anglais
    Le temps ronge l'amour comme l'acide.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par bistouille Voir le message
    https://www.developpez.net/forums/d1.../#post10555316

    Mais en consultant la documentation tkinter, tu aurais pu également le lire, c'est un réflexe à avoir de consulter les documentations, d'autant qu'une version de cette doc a été traduite en français, si tu as un peu de mal avec l'anglais
    Et c'est un fil d'une discussion que vous aviez vous même ouvert...
    Autrement dit on vous raconte des trucs puis vous vous contentez de partir avec le résultat et un peu plus tard c'est rebelote.
    Normal, il y a plein de choses à apprendre et les assimiler demande du temps.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et c'est un fil d'une discussion que vous aviez vous même ouvert...
    Autrement dit on vous raconte des trucs puis vous vous contentez de partir avec le résultat et un peu plus tard c'est rebelote.
    Normal, il y a plein de choses à apprendre et les assimiler demande du temps.
    - W
    Je me rappelais vaguement qui y'avait une mesure en nombre de caractère et une mesure en pixel. Mais je crois que j'aurai du lancer le sujet autrement pour obtenir une réponse précise. J'aurai du mettre :

    Sauriez-vous comment remplacer la condition if par la condition while dans ce code afin d'obtenir la taille maximale du 2ème bouton en un clic?

    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
    from tkinter import *
     
    master = Tk()
    L = 1000#master.winfo_screenwidth()
    H = 260#master.winfo_screenheight()
     
    master.minsize(L,H)
     
    def callback() :
     
            maLargB=int(b.winfo_width())
            maLargC=int(c.winfo_width())     
     
            if maLargC<=maLargB:  
               myPad0 = str(c.cget("padx"))              
               myPadx=int(myPad0)+1
               c.config(padx=myPadx)
     
    b = Button(master, text="Taille maximale à obtenir", command=callback)
    b.pack()
     
    c = Button(master, text="---", command=callback)
    c.pack()
    mainloop()

  17. #17
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Chez moi, ton code plante, addition d'un string avec un entier... Par défaut le padx est de 3 millimètres (aucune idée si ça varie selon les os), en spécifant le padx comme int lors de l'instanciation du bouton, là ça ne plantera plus, car tkinter aura spécifié un entier (en pixels).

    Sinon, while n'est pas une condition, si tu as une liste de bouton, ce n'est pas un while que tu devrais utiliser mais un for, mais comme je ne comprends rien de ce que tu veux faire
    Le temps ronge l'amour comme l'acide.

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Chez moi, ton code plante, addition d'un string avec un entier... Par défaut le padx est de 3 millimètres (aucune idée si ça varie selon les os), en spécifant le padx comme int lors de l'instanciation du bouton, là ça ne plantera plus, car tkinter aura spécifié un entier (en pixels).
    Je converti le string avant de l’additionner, y'a pas de raison que ça plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     myPad0 = str(c.cget("padx"))              
               myPadx=int(myPad0)+1
    Si je comprends bien, pour que le code ne plante plus, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = Button(master, text="---", command=callback, padx=3)
    OK

    Citation Envoyé par bistouille Voir le message
    Salut.
    Sinon, while n'est pas une condition, si tu as une liste de bouton, ce n'est pas un while que tu devrais utiliser mais un for, mais comme je ne comprends rien de ce que tu veux faire
    J'ai une liste de boutons sur plusieurs rangées mais la boucle while est nécessaire aussi. Ce que je veux faire c'est simple. C'est étirer les boutons d'une même rangée comme les mots d'une ligne que je voudrais justifier. Mais pour ça, il faut d'abord que j'apprenne à justifier un seul bouton.

    Si j'utilise un for comme ci-dessous, ça marche pas, le bouton dépasse la taille maximale fixée.

    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
    from tkinter import *
     
    master = Tk()
    L = 1000#master.winfo_screenwidth()
    H = 260#master.winfo_screenheight()
     
    master.minsize(L,H)
     
    def callback() :
            maLargB=int(b.winfo_width())
            maLargC=int(c.winfo_width())
            for x1 in range (100) :
                    if maLargC<=maLargB:  
                       myPad0 = str(c.cget("padx"))              
                       myPadx=int(myPad0)+1
                       c.config(padx=myPadx)
     
     
    b = Button(master, text="Taille maximale à obtenir", command=callback)
    b.pack()
     
    c = Button(master, text="---", command=callback, padx=3)
    c.pack()
    mainloop()

  19. #19
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Mais pourquoi donc utiliser une boucle pour un seul bouton ?

    Cela en revient à ce que t'as dit wiztricks précédemment.

    Oublie tkinter un moment, et pars d'une liste simple, représentant des largeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    largeurs = [24, 35, 47]
    Soit une largeur totale de 106.

    Admettons que l'on veuille avoir au total une largeur de 150 et répartir de façon la plus homogène possible la différence (soit 44) entre les éléments de cette liste de largeurs, comment ferais-tu ?
    Indice, tu auras besoin de l'opérateur modulo %, et du reste de la division entière //, ou de divmod au choix.

    Si tu arrives déjà à faire ça, tu auras bien avancé.
    Le temps ronge l'amour comme l'acide.

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Admettons que l'on veuille avoir au total une largeur de 150 et répartir de façon la plus homogène possible la différence (soit 44) entre les éléments de cette liste de largeurs, comment ferais-tu ?
    Indice, tu auras besoin de l'opérateur modulo %, et du reste de la division entière //, ou de divmod au choix.

    Si tu arrives déjà à faire ça, tu auras bien avancé.
    Merci pour cette idée. Je vais créer une liste qui contient les largeurs de mes boutons. Ensuite j'obtiendrai l'espacement qu'il doit y avoir entre les boutons. Mais je suis pas sûr d'arriver à bien justifier mes boutons avec cette méthode.

    Je crois qu'il me faudrait faire une boucle while avec les largeurs des boutons pour les incrémenter jusqu'à obtenir la longueur totale voulue et ensuite les appliquer concrètement aux boutons.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Incrémenter le padx
    Par Arsene12 dans le forum Tkinter
    Réponses: 4
    Dernier message: 26/11/2018, 11h20
  2. Incrémentation d'un champ de la table
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/09/2003, 20h33
  3. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19
  4. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10
  5. Post incrémentation?
    Par Defrag dans le forum C
    Réponses: 4
    Dernier message: 08/10/2002, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo