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 :

Pb dimensionnement d'un objet frame


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mai 2011
    Messages : 27
    Points : 27
    Points
    27
    Par défaut Pb dimensionnement d'un objet frame
    Bonsoir,

    J'essaie de faire varier les dimensions d'un objet Frame (cadre) dans une fenêtre mais lors de l'exécution, les dimensions restent inchangées alors que si je modifie les dimensions de la fenêtre (center_window), ces dernières sont bien prises en compte lors de l'exécution.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    # -*- coding: utf-8 -*-
     
    from tkinter import *
    import sqlite3
     
    class Fenetre1():
     
        nomentry=""
        prenomentry=""
     
        def __init__(self):
            self.fen = Tk()
            self.cadre = Frame(self.fen, borderwidth=10, relief="sunken", width=100, height=100)
            self.cadre.grid()
            self.center_window(500,400)
     
            ### Déclaration des variables pour récupérer les champs "entry"
            self.nomentry=StringVar()
            self.prenomentry=StringVar()
     
            ### Mise en place des deux champs de saisie
            Label(self.cadre, text="Nom :").grid(row=0,column=0,sticky=W, pady=5)
            Label(self.cadre, text="Prénom :").grid(row=1, column=0, sticky=W)
     
            self.e1 = Entry(self.cadre)
            self.e2 = Entry(self.cadre)
     
            self.e1.grid(row=0, column=1)
            self.e2.grid(row=1, column=1)
     
            ### Mise en place du bouton "quitter"
            self.bouton1 = Button(self.cadre,text="Quitter",command=self.fen.destroy)
            self.bouton1.grid(row=2,column=2,pady=10, padx=10, sticky=W)
     
            ### Mise en place du bouton "ajouter"
            self.bouton2 = Button(self.cadre,text="Ajouter", command=self.ajouter)
            self.bouton2.grid(row=2,column=0,pady=10, padx=10)
     
            ### Mise en place du bouton "supprimer"
            self.bouton3 = Button(self.cadre,text="Supprimer")
            self.bouton3.grid(row=2,column=1,pady=10, padx=10, sticky=W)
            self.fen.mainloop()
     
        def center_window(self,w=300, h=200):
            # obtenir les dimensions de l'écran
            ws = self.fen.winfo_screenwidth()
            hs = self.fen.winfo_screenheight()
            # calcul de la position x, y
            x = (ws/2) - (w/2)
            y = (hs/2) - (h/2)
            self.fen.geometry('%dx%d+%d+%d' % (w, h, x, y))
     
        def clear_entry(self):
            # Effacer les deux champs texte
            self.e1.delete(0, END)
            self.e2.delete(0, END)
     
     
        def ajouter(self):
            try:
                FichierDonnees="/home/admin73/essai/bd1.sq3"
                conn=sqlite3.connect(FichierDonnees)
                cur=conn.cursor()
     
                self.nomentry=str(self.e1.get())
                self.prenomentry=str(self.e2.get())
                cur.execute("INSERT INTO utilisateurs(nom, prenom) VALUES (?,?)",(self.nomentry,self.prenomentry))
                conn.commit()
                self.clear_entry()
            except Exception:
                print("Erreur")
                conn.rollback()
            finally:
                cur.close()
                conn.close()
     
     
    if __name__ == '__main__':
        app = Fenetre1()
    Quelqu'un peut-il m'aider à trouver mon erreur ?

    Merci

  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 781
    Points
    36 781
    Par défaut
    Salut,

    Chaque widget est dans une "fenêtre" i.e. une zone rectangulaire autour d'un contenu.
    Dans votre programme, vous avez une fenêtre principale qui s'affiche suite à l'appel Tk() dans laquelle sera affichée une Frame contenant...
    La méthode "center_window" modifie les dimensions de la fenêtre principale mais ne touche pas à celles de la Frame qu'il contient...
    Tout çà pour dire que je ne comprends pas trop ce que vous cherchez à faire.
    Sinon une façon simple pour que les dimensions d'une frame suivent celle de la fenêtre principale qui la contient serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> frame = tk.Frame(root, bg='red')
    >>> tk.Label(frame, text='hello').pack()
    >>> frame.pack(expand=1, fill='both')
    >>> tk.mainloop()
    Mais ce n'est peut être pas ce que vous souhaitiez.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mai 2011
    Messages : 27
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    Désolé, je n'ai pas été clair.
    Ce que je ne comprends pas, c'est pourquoi quand je change les options "width" et "height" de ma Frame, rien ne change à l'affichage (les dimensions de ma Frame semblent figées) alors que si je change les dimensions de ma fenêtre, je vois bien les changements à l'affichage.
    Ce que je cherche à terme, une fois que j'aurais mieux compris le fonctionnement, c'est de placer plusieurs Frame dans une fenêtre. Pour cela, je pense avoir besoin de dimensionner mes Frame mais je me trompe peut-être complètement sur la méthode à suivre.
    En tout cas, merci pour votre réponse, je vais regarder ce soir votre code car il y a des options que je ne connais pas.

    Bonne journée

  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 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par script73 Voir le message
    une fois que j'aurais mieux compris le fonctionnement, c'est de placer plusieurs Frame dans une fenêtre. Pour cela, je pense avoir besoin de dimensionner mes Frame mais je me trompe peut-être complètement sur la méthode à suivre.
    grid et pack, appelés aussi geometry managers, permettent déjà de disposer les widgets, les répartir dans l'espace disponible et de propager ou pas le changement de la taille de la fenêtre principale. Il faut juste passer un peu de temps à comprendre ce que font les différentes options et s'en souvenir lorsque vous devez construire une interface.

    Ils ne permettent pas de traiter tous les besoins. Il existe aussi place et canvas pour les cas désespérés. Mais si vous débutez, probable aussi que "comment faire avec" vous échappe encore.

    Citation Envoyé par script73 Voir le message
    Ce que je ne comprends pas, c'est pourquoi quand je change les options "width" et "height" de ma Frame, rien ne change à l'affichage (les dimensions de ma Frame semblent figées) alors que si je change les dimensions de ma fenêtre, je vois bien les changements à l'affichage.
    Une Frame est un container qui, par défaut, s'adapte aux dimensions des widgets affichés dedans.
    Mais il y a des gaps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import tkinter as tk
    >>> frame = tk.Frame(height=100, width=100, bg='red')
    >>> frame.pack()
    >>> frame.configure(height=200, width=200)
    Ici la Frame est vide, lorsqu'on change ses dimensions, çà se voit.
    Ajoutez un widget dedans, et "çà s'adapte":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> tk.Label(frame, text='foo')
    <tkinter.Label object at 0x00000000026A4358>
    >>> _.pack()
    >>>
    Pour changer ce défaut, il faut le demander via frame.[pack|grid]_propagate(0).

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mai 2011
    Messages : 27
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup pour tes réponses, je commence à mieux comprendre le fonctionnement des frames maintenant, je vais pouvoir continuer à avancer dans mon apprentissage de Tkinter.

    Bonne journée

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

Discussions similaires

  1. QTP gestion d'un objet Frame
    Par magfred03 dans le forum Test
    Réponses: 0
    Dernier message: 12/11/2012, 11h57
  2. [CS3] dimensionnement d'un objet
    Par hassen87 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 29/03/2011, 15h21
  3. Placement d'objet "Frame" a l'aide de grid
    Par ju_bicycle dans le forum Tkinter
    Réponses: 1
    Dernier message: 27/10/2009, 10h46
  4. frames et javascript - parametrage d'un nom d'objet
    Par titicurio dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/02/2006, 13h35
  5. accéder à un objet d'une frame
    Par pekka77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/11/2005, 10h35

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