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 :

Mettre un Button dans un Frame


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut Mettre un Button dans un Frame
    Bonjour,

    J'essaie désespérément de mettre un bouton dans un cadre mais je n'y arrive pas et je ne vois pas où se trouve le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from tkinter import *
     
    fenetre = Tk()
     
    cadre = Frame(fenetre, bg='green', width=300, height=200)
    cadre.pack()
     
    bouton =Button(cadre, text='Bouton')
    bouton.pack()
     
    fenetre.mainloop()
    Pourriez-vous me dire ce qui ne va pas?

    Par avance merci.

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Y a t-il reellement un soucis avec ce code?
    Il fonctionne tres bien et est super rapide

    Dans quoi est-il exécuté?
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Pas de souci avec ce code.
    rajoutez du padx/pady et vous verrez que votre Button est bien dans la Frame.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.pack(padx=10, pady=10)
    Pour rappel la géométrie du Widget Frame est de 0x0 lors de sa création et il s'étire au besoin de son contenu.

    @+

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Note:

    Vous pouvez aussi empêcher la propagation du pack au Widget Frame

    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 *
     
    fenetre = Tk()
    fenetre.pack_propagate(0)
     
    cadre = Frame(fenetre, bg='green', width=300, height=200)
    cadre.pack(fill=BOTH, expand=Y)
     
    bouton = Button(cadre, text='Bouton')
    bouton.pack()
     
    fenetre.mainloop()

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Bonjour à tous les deux et merci pour vos réponses.

    PauseKawa, vous avez su comprendre mon problème car, en fait, je pensais que la Frame n'existait pas puisque je ne voyais pas apparaître de cadre vert autour du bouton.

    Mais j'avoue ne pas comprendre complétement car dans ce premier cas le cadre apparaît bien en vert suivant les dimensions 300x200:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from tkinter import *
     
    fenetre = Tk()
     
    cadre = Frame(fenetre, bg='green', width=300, height=200)
    cadre.pack()
     
    fenetre.mainloop()
    ... mais lorsque je rajoute le bouton dans le cadre grâce aux deux lignes suivantes alors le cadre se "réduit" autour du bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bouton =Button(cadre, text='Bouton')
    bouton.pack()
    Ce que je ne comprends pas c'est que dans le premier cas, la fenêtre se redimensionne autour du cadre, mais lorsqu'on rajoute un bouton dans le cadre alors la fenêtre se redimensionne autour du bouton sans plus s'occuper du cadre.

    En fait, ce que je voudrais c'est faire apparaître un cadre vert de 300x200 avec un bouton dans ce cadre... et je ne vois pas comment faire.

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Le Widget Frame est un conteneur (LE conteneur par défaut).
    Lorsque l'on mets des Widgets dans un Widget sa géométrie "s'adapte" à son contenu, c'est la propagation (valable pour grid/pack).
    Comme déjà dit vous pouvez annuler cette 'propagation' avec .pack_propagate(0) (.grid_propagate(0)), que vous pouvez appliquer à la Frame seulement suivant votre besoin.
    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 *
     
    fenetre = Tk()
     
    cadre = Frame(fenetre, bg='green', width=300, height=200)
    cadre.pack(fill=BOTH, expand=Y)
    cadre.pack_propagate(0)
     
    bouton = Button(cadre, text='Bouton')
    bouton.pack()
     
    fenetre.mainloop()
    Ceci dit cela est applicable dés que l'on insere un Widget dans un autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from tkinter import *
     
    fenetre = Tk()
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    fenetre.mainloop()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from tkinter import *
     
    fenetre = Tk()
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    Button(cadre, text='Bouton').pack()
    fenetre.mainloop()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from tkinter import *
     
    fenetre = Tk()
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    cadre.pack_propagate(0)
    Button(cadre, text='Bouton').pack()
    fenetre.mainloop()
    Si le Widget ne contient pas d'autres Widgets la propagation n'as pas lieu.

    L'annulation de la propagation ne concerne que le 'contenue' du Widget.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from tkinter import *
     
    fenetre = Tk()
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    cadre.pack_propagate(0)
    Button(cadre, text='Bouton').grid(row=0, column=0)
    fenetre.mainloop()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from tkinter import *
     
    fenetre = Tk()
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    cadre.grid_propagate(0)
    Button(cadre, text='Bouton').grid(row=0, column=0)
    fenetre.mainloop()
    @+

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Ca y est, j'ai compris!

    En fait, je bloquais car je pensais que seule la fenêtre principale adaptait sa taille par propagation alors que, comme vous l'avez expliqué, ce sont tous les "Widgets contenants" tels que Frame et Canvas qui adaptent leurs dimensions aux Widgets qu'ils contiennent...

    Merci infiniment pour toutes vos explications limpides et très détaillées ainsi que pour le temps que vous avez consacré à répondre à mes questions.

    Je vous souhaite une très bonne fin de semaine PauseKawa ainsi qu'à tous.

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Une petite précision toutefois ():
    J'ai utiliser un Canvas et c'est une mauvais exemple car la Canvas ne gère pas son contenu comme un Frame ou un Label.
    Pour positionner un Widget dans un Canvas on n'utilise pas de gestionnaire de géométrie (pack/grid/place) mais .create_window() (.window_create() pour Text, cela correspond à 1 caractère) ce qui identifie le Widget comme un élément du Canvas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from tkinter import *
     
    fenetre = Tk()
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    button = Button(cadre, text='Bouton')
    cadre.create_window(150, 100, window=button)
    fenetre.mainloop()
    C'est ce qui est utiliser ici par exemple.

    @+

  9. #9
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Trois petites notes:

    Vous remarquerez avec l'exemple du Canvas et .create_window() que c'est l'utilisation d'un gestionnaire de géométrie (pack/grid) au sein d'un Widget qui fait la propagation.

    Contrairement à pack (qui utilise, pour simplifier, une géométrie haut/droite/gauche/bas > pack(side=*)) et grid (qui lui quadrille le Widget > grid(row=*, column=*)) place n'as pas de propagation. C'est normal car il positionne le Widget avec des coordonnées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from tkinter import *
     
    fenetre = Tk()
    cadre = Frame(fenetre, bg='green', width=300, height=200)
    cadre.pack()
    button = Button(cadre, text='Bouton')
    button.place(x=100, y=100)
    fenetre.mainloop()
    Voir ici par exemple.

    Le choix de gérer le contenant par rapport à son contenu est une bonne chose. Cela permets d’harmoniser l'interface vis à vis des éléments externes (taille de police de caractère etc)

    @+

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Ah oui, l'utilisation d'un .create_window() semble plus facile et évite les problèmes de propagation lorsqu'on place un Widget dans un Canvas, mais ce que vous avez dit reste vrai globalement - y compris pour le Canvas:

    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 *
     
    fenetre = Tk()
     
    cadre = Canvas(fenetre, bg='green', width=300, height=200)
    cadre.pack(fill=BOTH, expand=Y)
    cadre.pack_propagate(0)
     
    button = Button(cadre, text='Bouton')
    button.pack()
     
    fenetre.mainloop()

    "Le choix de gérer le contenant par rapport à son contenu est une bonne chose. Cela permets d’harmoniser l'interface vis à vis des éléments externes (taille de police de caractère etc)"

    C'est vrai que ça semble beaucoup mieux de gérer le contenant par rapport à son contenu mais parfois les pack et les grid sont peu souples.
    Par exemple, je ne vois pas comment mettre 2 boutons l'un à côté de l'autre en bas du cadre avec ces 2 méthodes... à moins évidemment de recréer un nouveau Frame dans le premier Frame et de mettre les 2 boutons dans ce second Frame.

  11. #11
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par sancho.poncho Voir le message
    C'est vrai que ça semble beaucoup mieux de gérer le contenant par rapport à son contenu mais parfois les pack et les grid sont peu souples.
    Par exemple, je ne vois pas comment mettre 2 boutons l'un à côté de l'autre en bas du cadre avec ces 2 méthodes... à moins évidemment de recréer un nouveau Frame dans le premier Frame et de mettre les 2 boutons dans ce second Frame.
    Il vous manque juste quelques infos.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from tkinter import *
     
    fenetre = Tk()
    cadre = Frame(fenetre, bg='green', width=300, height=200)
    cadre.pack(fill=BOTH, expand=Y)
    cadre.grid_propagate(0)
    cadre.rowconfigure(0, weight=1)
    cadre.columnconfigure(0, weight=1)
    Button(cadre, text='Bouton1').grid(row=1, column=0)
    Button(cadre, text='Bouton2').grid(row=1, column=1, sticky=N+S+W+E)
    fenetre.mainloop()
    A vous de chercher dans la doc

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Effectivement, il me manque quelques infos... et c'est un euphémisme

    Mais grâce à des personnes comme vous des gens comme moi réussissent à progresser grandement (en tout cas à leur humble niveau).

    Je vous remercie sincèrement pour votre aide et vos conseils PauseKawa et je vous souhaite une très bonne soirée.

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

Discussions similaires

  1. mettre une scrollbar dans une frame
    Par RyzenOC dans le forum Général Python
    Réponses: 21
    Dernier message: 22/06/2015, 16h38
  2. [XL-2010] Comment accéder à plusieurs toggle button dans une frame ActiveX
    Par hzdvd dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 29/09/2013, 18h44
  3. UI Dialog, mettre une condition dans "buttons"
    Par baggie dans le forum jQuery
    Réponses: 2
    Dernier message: 04/11/2010, 11h09
  4. Réponses: 9
    Dernier message: 17/10/2005, 10h44
  5. comment mettre du texte formaté dans une frame?
    Par afrikha dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 09/10/2005, 14h55

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