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 :

crée plusieur widgets et les positionner


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    Par défaut crée plusieur widgets et les positionner
    Bonjour,

    Je voudrais savoir comment crée plusieurs frame et label , avec un boucle "for" ca m'en crée qu'un .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    fenetre = Tk()
     
    for i in range(0,4):
        tache = Frame(niveau,borderwidth=10,relief=FLAT,bg='Brown')
        tache.pack(padx=0,pady=10)
     
        nom = Frame(tache,borderwidth=10,relief=GROOVE,bg='red')
        nom.pack(side="bottom")
     
       fenetre.mainloop()
    et je voudrais savoir comment positionner un widgets plus précisément que top,left,... .

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par pitchu Voir le message
    Bonjour,

    Je voudrais savoir comment crée plusieurs frame et label , avec un boucle "for" ca m'en crée qu'un .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    fenetre = Tk()
     
    for i in range(0,4):
        tache = Frame(niveau,borderwidth=10,relief=FLAT,bg='Brown')
        tache.pack(padx=0,pady=10)
     
        nom = Frame(tache,borderwidth=10,relief=GROOVE,bg='red')
        nom.pack(side="bottom")
     
       fenetre.mainloop()
    et je voudrais savoir comment positionner un widgets plus précisément que top,left,... .
    Bonjour,

    Tel que publié actuellement, votre code ne nous dit pas que sont les variables niveau et tache ?

    Que voulez-vous faire ?

    Réponse A : vous voulez créer plusieurs frames imbriquées les unes dans les autres avec une boucle for ... in ...

    Réponse B : vous voulez créer plusieurs labels dans une même frame grâce à une boucle for ... in ...

    Réponse C : vous voulez imbriquer plusieurs frames les unes dans les autres ET créer plusieurs labels dans chacune de ces frames grâce à une boucle for ... in ...

    Si vous voulez que l'on vous aide vraiment, peut-être serait-il plus pertinent de publier le code qui pose problème au complet ?

    @+.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    Par défaut
    bonjour,

    J'ai réussi à crée plusieurs widgets mais il y en a un qui est écrasé ou sort de la fenêtre comment pourrais-je adapter leurs tailles pour que tous les widgets soient affiché ?

    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
     
     
    fenetre = Tk()
     
     
     
    niveau = Frame(fenetre,borderwidth=5,relief=FLAT,bg='Brown')
    niveau.pack(padx=0,pady=10)
     
     
    for i in range(0,10):
     
    #-------------------------------------------------------------------------
        tache = Frame(niveau,borderwidth=10,relief=FLAT,bg='yellow')
        tache.pack(padx=0,pady=10)
     
     
        nom = Frame(tache,borderwidth=5,relief=GROOVE,bg='red')
        nom.pack(side="bottom",padx=10)
     
        tot = Frame(tache,borderwidth=5,relief=GROOVE,bg='black')
        tot.pack(side="left")
     
        tard = Frame(tache,borderwidth=5,relief=GROOVE,bg='violet')
        tard.pack(side="right")
     
     
        Label(nom,text="aaaaaa",bg='green').pack(padx=20,pady=10)
        Label(tot,text="tooooooooot",bg='pink').pack(padx=5,pady=5)
        Label(tard,text="taaaard",bg='white').pack(padx=5,pady=5)
     
     
     
    fenetre.mainloop()

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par pitchu Voir le message
    bonjour,

    J'ai réussi à crée plusieurs widgets mais il y en a un qui est écrasé ou sort de la fenêtre comment pourrais-je adapter leurs tailles pour que tous les widgets soient affiché ?

    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
     
     
    fenetre = Tk()
     
     
     
    niveau = Frame(fenetre,borderwidth=5,relief=FLAT,bg='Brown')
    niveau.pack(padx=0,pady=10)
     
     
    for i in range(0,10):
     
    #-------------------------------------------------------------------------
        tache = Frame(niveau,borderwidth=10,relief=FLAT,bg='yellow')
        tache.pack(padx=0,pady=10)
     
     
        nom = Frame(tache,borderwidth=5,relief=GROOVE,bg='red')
        nom.pack(side="bottom",padx=10)
     
        tot = Frame(tache,borderwidth=5,relief=GROOVE,bg='black')
        tot.pack(side="left")
     
        tard = Frame(tache,borderwidth=5,relief=GROOVE,bg='violet')
        tard.pack(side="right")
     
     
        Label(nom,text="aaaaaa",bg='green').pack(padx=20,pady=10)
        Label(tot,text="tooooooooot",bg='pink').pack(padx=5,pady=5)
        Label(tard,text="taaaard",bg='white').pack(padx=5,pady=5)
     
     
     
    fenetre.mainloop()
    Bonjour,

    Après avoir testé votre code : il s'agit ni plus ni moins que d'un débordement d'affichage.

    Vous avez plus de widgets affichés par pack() que la fenêtre ne peut en afficher réellement.

    D'où "l'écrasement" des derniers widgets, en bas.

    Si vous devez réellement afficher beaucoup de widgets, peut-être vaudrait-il mieux recourir à un objet type ScrollView(), un viewport scrollable ?

    @+.

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Si tu utilises dix fois le même nom tache pour dix widgets différents et que tu les places tous les dix au même endroit, que peux tu attendre ?

    Sauve tes instances de widgets dans un dictionnaire et pense à incrémenter les .pack(padx=0,pady=10) pour ne pas les superposer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    widgets = {}
    for i in range(10)
        widgets["tache_%s" %i] = Frame(niveau,borderwidth=10,relief=FLAT,bg='yellow')
        widgets["tache_%s" %i].pack(padx=0,pady=10)
        widgets["nom_%s" %i] = Frame(tache,borderwidth=5,relief=GROOVE,bg='red')
        widgets["nom_%s" %i].pack(side="bottom",padx=10)
        widgets["tot_%s" %i] = Frame(tache,borderwidth=5,relief=GROOVE,bg='black')
        widgets["tot_%s" %i].pack(side="left")
        etc ...
    De surcroît, tu devras sans doute accéder à tes widgets par après dans ton code, ça n'aurait pas été possible avec ton code puisqu'ils avaient tous le même nom.

  6. #6
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Bonjours bienvenue néo-pythons,

    Je pense que la méthode pack() n'est pas la bonne solution (géométrie manager) pour placer 4 Frame dans un une Frame parente qui elle peut être placer avec la méthode pack() car c'est le conteneur d'une autres Frame() qui elle même est la fenêtre parentes de tes 4 Frames.

    Il faudrait utiliser la méthode grid() qui est plus évoluer que pack, je sais tu débute, qui est en faîtes un placement par grille alors que la méthode pack() ne fait que emballer avec des options de placement les widgets...

    La méthode grid() permet de placer ses widgets de en définissant des grilles configurable en termes de lignes et de colonnes dans un widget parent qui peut être placer avec la méthode pack().

    Disont que tu veut faire une fenêtre avec un Label sur la première ligne et trois boutons chacun dans une cellule sous le Label:

    (Désolé pour la difficulté de la directive de génération des boutons mais ça exécute simplement un string qui peut être formater avec la primitive format() et ainsi générer des variables ce qui te permettra de garder une référence a ton widget.)

    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
     
    # -*- coding: utf-8 -*-
     
    # Cette première ligne précise l'encodage du fichier de ton code source et si tu ne la mets pas tu aura un traceback sous Linux. 
     
    from Tkinter import *
     
    root=Tk()
     
    root_frame=Frame(root)
    root_frame.pack()
     
    label_upper=Label(root_frame,text="Line Label")
    label_upper.grid(row=0,column=0,columnspan=3,in_=root_frame) # Sur la première ligne en prenant 3 cellules (columnspan) avec comme parent root_frame
     
    for i in range(0,3) :
      exec("but_{0}=Button(root_frame,text=\"button number_{0}\")".format(i))     # Ainsi tu garde une référence a chaque bouton en exécutant un string grâce a exec().
      exec("but_{0}.grid(row=1,column={0},in_=root_frame)".format(i))             # Placement dans la grille.
     
    root.mainloop()
    Désolé pour la complexité du code mais il est impératif de garder une référence de ce que tu génère...
    Tu pourra ainsi refaire appel au bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def printer() :
      print "c\'est facile en faîtes"
     
    but_0.config(command=printer)
    Et en appelant:
    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
     
    print ma_var.grid.__doc__      # C'est une méthode spéciale qui fournis de la documentation sur l'objet que tu manipule et qui existe pratiquement toujours 
     
    Position a widget in the parent widget in a grid. Use as options:
            column=number - use cell identified with given column (starting with 0)
            columnspan=number - this widget will span several columns
            in=master - use master to contain this widget
            in_=master - see 'in' option description
            ipadx=amount - add internal padding in x direction
            ipady=amount - add internal padding in y direction
            padx=amount - add padding in x direction
            pady=amount - add padding in y direction
            row=number - use cell identified with given row (starting with 0)
            rowspan=number - this widget will span several rows
            sticky=NSEW - if cell is larger on which sides will this
                                    widget stick to the cell boundary
    Si tu a des questions surtout n'hésite pas.

    Sinon a tu déjà télécharger la documentation officiel de ta version de python:

    Pour python 2.7.6
    Pour python 3.4.0

    Je te conseille le format *.html (Ouvrir le fichier index.html et l'ajouter a tes bookmarks) ainsi tu pourra faire des recherches dans la documentation officielle de tous les modules de la distribution standart (lien Library) , cela te sera grandement utiles durant toute ta quête de python.

    Sur ce bon python a toi en espérant ne pas t'avoir trop embêter.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    Par défaut
    Bonjour,
    en fait je voudrais faire l'interface d'un graphe MPM , j'affiche les taches et je les relie par rapport a leur successeur.
    Je vais regarder la doc pour la méthode grid()

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par pitchu Voir le message
    Bonjour,
    en fait je voudrais faire l'interface d'un graphe MPM , j'affiche les taches et je les relie par rapport a leur successeur.
    Je vais regarder la doc pour la méthode grid()
    Bonjour,

    Dans ce cas, pourquoi ne pas utiliser plutôt le canevas graphique de tkinter ?

    Doc :

    http://infohost.nmt.edu/tcc/help/pub...eb/canvas.html

    @+.

Discussions similaires

  1. [VB.NET] [newbie] Charger plusieurs .X et les déplacer
    Par tamagotchi dans le forum DirectX
    Réponses: 12
    Dernier message: 12/04/2006, 11h45
  2. Plusieurs styles pour les liens
    Par oranoutan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 11/01/2006, 11h49
  3. Réponses: 2
    Dernier message: 21/09/2005, 12h18
  4. Réponses: 5
    Dernier message: 05/10/2004, 13h05
  5. Réponses: 4
    Dernier message: 11/09/2004, 16h38

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