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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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()
    @+

+ 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