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 :

Positionnement boutons avec pack()


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 Positionnement boutons avec pack()
    Bonjour,

    j'ai un bouton "OK" et je voudrais, lorsqu'on y clique dessus, qu'il ajoute des boutons juste à la ligne en dessous en partant de la gauche. Dans mon code, je voudrais faire bi.pack(side="top-left") mais ça n'existe pas. Pourriez-vous me dire si c'est possible svp?

    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
    from tkinter import *
     
    master = Tk()
    master.minsize(300,100)
    master.geometry("320x600")
     
    def callback(): 
        bi = Button(master,height=5, width=5)
        bi.pack(side="left")
        master.update()
     
     
    b = Button(master, text="OK", command=callback)
    b.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
    Pourriez-vous me dire si c'est possible svp?
    Pour autant que vous vouliez ajouter une "ligne" de Button en dessous du premier, sûr que çà va pas être facile avec "pack"...
    Mais rien ne vous empêche d'utiliser grid, ou d'ajouter une Frame contenant vos Button en dessous (avec pack): vous connaissiez les possibilités des différents outils, à vous de les utiliser au mieux pour que votre interface ait le rendu attendu.

    - 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
    Salut,

    Pour autant que vous vouliez ajouter une "ligne" de Button en dessous du premier, sûr que çà va pas être facile avec "pack"...
    Mais rien ne vous empêche d'utiliser grid, ou d'ajouter une Frame contenant vos Button en dessous (avec pack): vous connaissiez les possibilités des différents outils, à vous de les utiliser au mieux pour que votre interface ait le rendu attendu.
    - W
    En fait j'ai déja utilisé l'ajout de frame avec pack(). J'ai créé un canvas avec une frame dans laquelle j'ajoute les boutons. J’additionne la taille des boutons et lorsque la somme dépasse la largeur de la frame, je détruis le dernier bouton ajouté, je créé une nouvelle frame et j'ajoute à nouveau mon bouton. Mais y'a un problème. Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if TailleTotaleBoutons>frame1.winfo_width():
    les derniers boutons s'ajoutent en dépassant le bord droit de la frame.

    Il me faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if TailleTotaleBoutons>frame1.winfo_width()-200:
    et là ça marche mais je vois pas pourquoi. Le padx n'est que de 50 pour la frame.

  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
    Salut,

    Citation Envoyé par Arsene12 Voir le message
    J’additionne la taille des boutons et lorsque la somme dépasse la largeur de la frame, je détruis le dernier bouton ajouté, je créé une nouvelle frame et j'ajoute à nouveau mon bouton. Mais y'a un problème.
    Expliquez moi un peu le rapport de ceci avec la question posée? Et en quoi le code posté initialement permet de reproduire ce que vous racontez, comprendre le piège dans lequel vous êtes tombé pour éventuellement vous proposer une solution?

    - 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
    Salut,

    Expliquez moi un peu le rapport de ceci avec la question posée? Et en quoi le code posté initialement permet de reproduire ce que vous racontez, comprendre le piège dans lequel vous êtes tombé pour éventuellement vous proposer une solution?

    - W
    Je pense avoir très bien expliqué ce que je voulais faire dès le début. En rectifiant le code ci-dessous, on doit pouvoir y arriver :


    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
    from tkinter import *
     
    master = Tk()
    master.minsize(300,100)
    master.geometry("320x600")
     
     
    def callback():
        n=0
        az = Frame(master, background="green")  # je créé une Frame
        while n<50 :   # tant que j'ai pas crée 50 boutons  
            bi = Button(az,height=5, width=5, background="black")
            bi.pack(side="left")  # j'ajoute un bouton
            master.update()
            gf = bi.winfo_rootx()
            print(gf)
            n=n+1
            if gf ==0 :  # si le bouton est situé en totalité au delà du bord droit de la fenêtre
                bi.destroy()  # je supprime le dernier bouton que j'ai créé
                az = Frame(master, background="red")
                az.pack(fill=X)   # je créé une nouvelle Frame
                bi = Button(az,height=5, width=5, background="blue")
                bi.pack(side="left")    # j'ajoute un nouveau bouton
                master.update()       
     
     
    b = Button(master, text="OK", command=callback)
    b.pack()
     
    mainloop()

    Maintenant c'est ce code que je voudrais rectifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if gf ==0 :  # si le bouton est situé en totalité au delà du bord droit de la fenêtre
    Je voudrais que la condition s'exécute si le bouton est situé en partie ou en totalité au delà du bord droit de la fenêtre.

    J'ai fais ce code ci-dessous mais y'a juste un problème avec la dernière ligne quand elle est en dehors du bord inférieur de la fenêtre principale. Pour visualiser, il faut élargir la fenêtre principale.

    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
    from tkinter import *
     
    master = Tk()
    master.minsize(300,100)
    master.geometry("320x600")
     
     
    def callback():
        n=0
        TTb = 0
        rootTaille = master.winfo_width() 
        az = Frame(master, background="green")  # je créé une Frame
        az.pack(fill=X)
        master.update_idletasks()
        while n<50 :   # tant que j'ai pas crée 50 boutons  
            bi = Button(az,height=5, width=5, background="black")
            bi.pack(side="left")  # j'ajoute un bouton
            TBtn = bi.winfo_width()
            print(TBtn)
            master.update_idletasks()
            TBtn = bi.winfo_width()        
            TTb = TTb +TBtn               
            print(TBtn)
            n=n+1
            if  TTb>=rootTaille :#gf ==0 :  # si le bouton est situé en totalité au delà du bord droit de la fenêtre
                bi.destroy()  # je supprime le dernier bouton que j'ai créé
                az = Frame(master, background="red")
                az.pack(fill=X)   # je créé une nouvelle Frame
                bi = Button(az,height=5, width=5, background="blue")
                bi.pack(side="left")    # j'ajoute un nouveau bouton
                master.update_idletasks()  
                TBtn = bi.winfo_width()
                TTb = TBtn                 
     
     
    b = Button(master, text="OK", command=callback)
    b.pack()
     
    mainloop()

  6. #6
    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.

    Tes sujets concernent toujours la même chose, quel est l'objectif à terme de ton application ? Et surtout à quoi sont destinés tes boutons ?

    wiztricks t'avais conseillé d'utiliser un widget Text pour faire cela, et pour cause, tu souhaites avoir un flux de texte cliquable, justifié, sans doute extensible lors du redimensionnement, un widget Text est bien mieux adapté pour le faire. Car là, tu n'as pas fini de te casser les dents sur tes boutons. Alors oui, le widget Text est plus compliqué à appréhender, mais cela en vaut largement la peine, au pire tu pourrais utiliser un canevas, ce sera toujours mieux et plus facile à mettre en œuvre que des boutons et frames.

    Maintenant, si tu persistes avec tes boutons, voici une méthode simple qui fonctionne, tout est une question de logique.

    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
     
    texte = (
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed doeiusmod '
        'tempor incididunt ut labore et dolore magna aliqua. Ut enimad minim '
        'veniam, quis nostrud exercitation ullamco laboris nisi utaliquip ex ea '
        'commodo consequat. Duis aute irure dolor inreprehenderit in voluptate '
        'velit esse cillum dolore eu fugiat nullapariatur. Excepteur sint occaecat '
        'cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id '
        'est laborum.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed '
        'doeiusmod tempor incididunt ut labore et dolore magna aliqua.'
    )
     
    def callback() :
        conteneur = Frame(master, bg='yellow')
        conteneur.pack()
     
        x = 0
        pack = True
        i = 0
        bg = ('red', 'pink')
     
        for mot in texte.split(' ') :
            if not pack or not x :
                frame = Frame(conteneur, bg=bg[i%2], width=320, height=30)
                frame.pack()
                frame.pack_propagate(False)
                i += 1
            if not pack :
                x = larg
                pack = True
            try :
                # On pack en définissant le parent
                bout.pack(in_=frame, side='left')
            except :
                pass
            # On ne définit pas le parent
            bout = Button(text=mot)
     
            larg = bout.winfo_reqwidth()
     
            if x + larg > 320 :
                pack = False
            else :
                x += larg
    Le temps ronge l'amour comme l'acide.

  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 bistouille Voir le message
    Salut.

    Tes sujets concernent toujours la même chose, quel est l'objectif à terme de ton application ? Et surtout à quoi sont destinés tes boutons ?

    wiztricks t'avais conseillé d'utiliser un widget Text pour faire cela, et pour cause, tu souhaites avoir un flux de texte cliquable, justifié, sans doute extensible lors du redimensionnement, un widget Text est bien mieux adapté pour le faire. Car là, tu n'as pas fini de te casser les dents sur tes boutons. Alors oui, le widget Text est plus compliqué à appréhender, mais cela en vaut largement la peine, au pire tu pourrais utiliser un canevas, ce sera toujours mieux et plus facile à mettre en œuvre que des boutons et frames.

    Maintenant, si tu persistes avec tes boutons, voici une méthode simple qui fonctionne, tout est une question de logique.
    Je pense que je vais utiliser le widget text mais je tenais quand même à savoir mettre un court paragraphe sous forme de boutons.
    En tous cas, Bravo pour ce code. J'arrive à faire exactement la même chose mais avec une technique moins savante.

    Je créé un canvas qui contient une frame dans laquelle je rajoute d'autres frames à chaque fois que je veux créer une rangée de bouton.

    Je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TTbtn = Somme de la largeur de tous les boutons d'une même ligne.
    maFrameLigne.winfo_width() : largeur de la frame contenant les boutons d'une même rangée.
     
    if TTBtn<maFrameLigne.winfo_width()-4: # je dois rajouter -4 pour que ça marche et je vois pas pourquoi.
    Dans le code que vous m'avez posté, comme je suis pas expert, je n'aurai même pas penser à utiliser try et j'aurais mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bout = Button(text=mot)
    bout.pack(in_=frame, side='left')
    De plus, je connaissais pas non plus la méthode in_=frame pour insérer le bouton dans la frame.
    Merci beaucoup pour cette aide précieuse.

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

Discussions similaires

  1. Aligner bouton avec Pack()
    Par Arsene12 dans le forum Tkinter
    Réponses: 8
    Dernier message: 03/11/2018, 07h16
  2. [Python 2.X] wxPython positionner 4 boutons avec wx.BoxSizer
    Par abdel792 dans le forum wxPython
    Réponses: 1
    Dernier message: 31/05/2015, 18h51
  3. TK : Positionnement de Widget avec pack()
    Par Luciefer dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 05/07/2007, 13h30
  4. [MFC] bouton avec option "accept files"
    Par bigboomshakala dans le forum MFC
    Réponses: 4
    Dernier message: 23/06/2004, 16h15
  5. Construire chemin sur bouton avec évt Javascript
    Par Ph. B. dans le forum XMLRAD
    Réponses: 4
    Dernier message: 27/05/2003, 10h26

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