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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 éprouvé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 éprouvé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

+ Répondre à la discussion
Cette discussion est résolue.

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