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 :

ajouter des widgets dans des frames [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Invité ajouter des widgets dans des... 26/03/2017, 11h26
wiztricks Salut, Lorsque vous... 26/03/2017, 12h12
Invité Objet ou procédural cela ne... 26/03/2017, 18h45
wiztricks Si self.leftTop est None, le... 26/03/2017, 19h04
Invité je vois l'erreur concernant... 26/03/2017, 19h21
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut ajouter des widgets dans des frames
    Bonjour,

    j'aimerais comprendre pourquoi je ne peux pas rajouter des widgets (Label, Text etc) dans différentes Frames que composent ma fenêtre principale.

    Voici mon code très simple, vous y verrez mes tentatives d'ajout d'un simple label, j'ai d'abord utilisé les points cardinaux, puis ici, les rows/column, mais sans succès :
    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
     
    from tkinter import *
     
    class Application(Frame):
        def __init__(self, master):
            Frame.__init__(self,master)
            self.grid()
            self.frameLeftTop()
            self.frameLeftBottom()
            self.frameRightTop()
            self.frameRightBottom()
     
        def frameLeftTop(self):
            self.leftTop = Frame(root,width=400,height=200,pady=5,bg="red").grid(row=0, column=0)
            Label(self.leftTop,text="Label 1").grid(row=0, column=0,sticky="wn")
            Text(self.leftTop,height=6,width=40).grid(row=1,column=0,sticky="wn")
            Button(self.leftTop,text="Exécuter",width=50,bg="white").grid(row=2,column=0,sticky="wn")
     
        def frameLeftBottom(self):
            self.leftBottom = Frame(root,width=400,height=200,pady=5,bg="green").grid(row=1, column=0)
            Label(self.leftBottom,text="Label 2").grid(row=1, column=0,sticky="n")
     
        def frameRightTop(self):
            self.rightTop = Frame(root,width=400,height=200,pady=5,bg="yellow").grid(row=0, column=1)
            Label(self.rightTop,text="Label 3").grid(row=0, column=1,sticky="n")
     
        def frameRightBottom(self):
            self.rightBottom = Frame(root,width=400,height=200,pady=5,bg="black").grid(row=1, column=1)
            Label(self.rightBottom,text="Label 4").grid(row=1, column=1,sticky="n")
     
    root = Tk()
    root.title("Frames")
    root.geometry("800x400")
    app = Application(root)
     
    root.mainloop()
    Je ne comprends pas le comportement des rows,columns. Mes labels devraient se situer en row=0 et column=0 de CHAQUE Frame mais visiblement elles se comportent comme si je les plaçaient dans la fenêtre principale :
    comme suit tout marche, mais utilise le conteneur principal du coup et plus mes Frames de "sous divisions" :
    row=0, column=0
    row=1, column=0
    row=0, column=1
    row=1, column=1

    les Frames ne sont elles pas des conteneurs à part entière tout comme root = Tk() ?
    en somme je voudrais des boites dans une boite, et y placer mes widgets à l’intérieur...

    Merci à tous.
    Dernière modification par Invité ; 26/03/2017 à 12h06.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 726
    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 726
    Par défaut
    Salut,

    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       def frameLeftTop(self):
            self.leftTop = Frame(root,width=400,height=200,pady=5,bg="red").grid(row=0, column=0)
            Label(self.leftTop,text="Label 1").grid(row=0, column=0,sticky="wn")
            Text(self.leftTop,height=6,width=40).grid(row=1,column=0,sticky="wn")
            Button(self.leftTop,text="Exécuter",width=50,bg="white").grid(row=2,column=0,sticky="wn")
    et que çà ne fait pas ce qui est attendu, la première chose à faire est de vérifier que çà se passe bien comme vous le pensez. Par exemple, en ajoutant, un "print" pour vérifier que self.leftTop est bien une instance de Frame...

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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Objet ou procédural cela ne fonctionne pas...

    Si je poste c'est justement pour comprendre et je ne vois pas où vous voulez en venir !

    Dommage, qu'on réponde à ma question par une autre question, mais bon...

    Bref, l'instance "print(self.leftTop)" est "none" donc oui, elle n'existe pas.
    Je ne vois toujours pas comment procéder, puisque avec ou sans classe cela ne fait pas le boulot.

    De plus, leftTop est none ok, mais mes labels s’affichent bien, d'où mon incompréhension pour l'ajout d'autres widgets qui eux ne se comportent pas comme j’aimerais (positionnement pas là où je le souhaiterais.)

    je pense faire un minimum de recherches et d'explications pour décrire mon souci. Je ne demande pas du tout cuit, j'ai codé et présenté ma démarche.

    Merci de votre aide
    Dernière modification par Invité ; 26/03/2017 à 19h02.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 726
    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 726
    Par défaut
    Citation Envoyé par hyrule Voir le message
    Dommage, qu'on réponde à ma question par une autre question, mais bon, l'instance "print(self.leftTop)" est "none" donc oui, elle n'existe pas.
    Si self.leftTop est None, le .grid s'appliquera par défaut à la fenêtre principale.
    Jusque là ça fonctionne comme attendu.
    Après la question est dans le raccourci Frame().grid() qui retourne None, ce qui est dommage car vous avez besoin d'une instance de Frame... et donc impossible de prendre un tel raccourci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> frame = Frame()
    >>> print(frame)
    .53333520
    là j'ai ma Frame...
    puis frame.grid().
    Citation Envoyé par hyrule Voir le message
    Si je poste c'est justement pour comprendre et je ne vois pas où vous voulez en venir !

    Dommage, qu'on réponde à ma question par une autre question, mais bon...
    C'est vous qui devez questionner votre code et essayer d'y répondre en vous assurant que ce que vous avez écrit fait bien ce que vous pensez... Et pour çà "print" est l'instruction magique que vous devez apprendre à utiliser.

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

  5. #5
    Invité
    Invité(e)
    Par défaut
    je vois l'erreur concernant mes "raccourcis"

    Mais visiblement je ne comprends toujours pas :

    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
     
        def frameLeftTop(self):
            self.leftTop = Frame(root,width=400,height=200,pady=5,bg="red")
            self.leftTop.grid(row=0,column=0,sticky="n")
     
            self.label1 = Label(self.leftTop,text="Label 1")  
            self.label1.grid(row=0,column=0,sticky="n")
     
        def frameLeftBottom(self):
            self.leftBottom = Frame(root,width=400,height=200,bg="green")
            self.leftBottom.grid(row=1,column=0,sticky="n")
     
            self.label2 = Label(self.leftBottom,text="Label 2")
            self.label2.grid(row=0,column=0,sticky="n")
     
        def frameRightTop(self):
            self.rightTop = Frame(root,width=400,height=200,bg="yellow")
            self.rightTop.grid(row=0, column=1,sticky="n")
     
            self.label3 = Label(self.rightTop,text="Label 3")
            self.label3.grid(row=0,column=0,sticky="n")
     
        def frameRightBottom(self):
            self.rightBottom = Frame(root,width=400,height=200,bg="black")
            self.rightBottom.grid(row=1,column=1,sticky="n")
     
            self.label4 = Label(self.rightBottom,text="Label 4")
            self.label4.grid(row=0,column=0,sticky="n")

    Mes Frames ne sont plus une dans chaque coin, avec un label dans chaque Frame, mais cette fois mes Labels sont bien là...

    je comprends votre démarche, je débug, mais sans comprendre j'ai beau le faire encore et encore, à un moment donné il faut bien de l'aide, non ? ou tout doit être inné ?! partage/forum...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 726
    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 726
    Par défaut
    Salut,

    Citation Envoyé par hyrule Voir le message
    je vois l'erreur concernant mes "raccourcis"

    Mais visiblement je ne comprends toujours pas :
    ...
    Mes Frames ne sont plus une dans chaque coin, avec un label dans chaque Frame, mais cette fois mes Labels sont bien là...
    Votre question/problème de départ est résolu... et je ne comprends pas ce que vous ne comprenez pas.

    Citation Envoyé par hyrule Voir le message
    je comprends votre démarche, je débug, mais sans comprendre j'ai beau le faire encore et encore, à un moment donné il faut bien de l'aide, non ? ou tout doit être inné ?! partage/forum...
    Ben imaginez cuisiner un plat en vous appliquant à suivre une recette.
    Si çà dit "ajouter du sel" et que vous ajoutez un truc qui y ressemble vaguement (du sucre...) votre plat ne sera pas forcément dégueulasse mais ne ressemblera pas à ce que vous espériez.
    Est-il inné d'avoir un minimum de rigueur et de faire attention à ce qu'on fait? Certainement pas.
    Mais c'est une qualité que vous devez cultiver pour programmer, cuisiner,... et si en cuisine on peut "goûter" le sel, le sucre,... en programmation on vérifie qu'on passe bien le type de paramètre attendu et on s'y applique car Python étant un langage interprété prendra tout ce qu'il peut.

    - 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. Réponses: 0
    Dernier message: 24/03/2017, 09h01
  2. Réponses: 1
    Dernier message: 20/09/2016, 22h09
  3. [Python 2.X] Alignement des widgets dans des frames
    Par Shozma dans le forum Tkinter
    Réponses: 2
    Dernier message: 02/06/2016, 15h52
  4. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 16h26

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