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 :

[Tkinter] Frame et .grid()


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut [Tkinter] Frame et .grid()
    Bonjour,

    Je débute en python, Tkinter.

    J'ai trouvé un exemple de GUI créee à partir d'une classe. Je la tripatouille afin d'essayer de comprendre.

    Dans le code qui suit je n'arrive pas à placer mon Frame en haut à gauche de la fenêtre principale.

    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
     
    import Tkinter #>> oblige a une syntaxe pointee: plus claire
     
    class gui(Tkinter.Tk):
     
    	# le constructeur
    	def __init__(self, parent):
     
    		# appel au constructeur de la classe parente
    		Tkinter.Tk.__init__(self, parent)
    		# garder une ref de notre "parent"
    		self.parent= parent
     
    		# appel a la methode d'initialisation
    		self.initialize()
     
    	# Les methodes
    	def initialize(self):
    		# creation et ajout d'un layout_manager sur self (equivalent a la racine)
    		self.grid()
     
    		# creation et ajout d'un widget Frame sur le layout_manager
    		self.frm_01= Tkinter.Frame(self, width= 400, height= 100, relief= "solid", bg= 'red', bd= 1) # creation ds le self (equivalent a racine)
    		self.frm_01.grid(row= 0, column= 0, sticky= "N") # disposition sur le layout_manager
     
    # Corps principal du programme
     
    if __name__== "__main__":
     
    	# instanciation de la classe, aucun parent car c'est la fenetre de base
    	racine= gui(None)
     
    	# attributs de la fenetre principale (racine)
    	racine.geometry("800x600+10+ 100")
    	racine.title("racine= root (de la classe gui)")
     
    	# on boucle sur l'appli
    	racine.mainloop()
    Mon Frame est bien crée mais reste obstinément centré dans la fenetre principale.

    J'ai vraiment recherché et n'ai pas trouvé d'exemple correspondant à mon problème. Beaucoup trop d'exemples st à partir de scripts.

    Vous auriez des explications s'il vous plait.

    Merci bien
    areuh

  2. #2
    Membre régulier Avatar de perchman
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 199
    Points : 90
    Points
    90
    Par défaut
    Bonsoir,

    je pense que le fait que tu n'es qu'un seul frame dans ta fenetre et rien d'autre ne te permet pas de le placer en haut à gauche...

    Mais tu devrais essayé sur des exemples plus simples !!


    Bon courage

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut Perchman,

    Merci de la réponse.
    Alors, je m'etais aperçu qu'avec 1 seule Frame de dimensions équivalentes à la fenetre principale (nommée racine), le widdet Frame était positionné correctement. Avec ta réponse, cela fonctionne, je mets 2 Frame l'une à côté de l'autre, les dimensionne pour qu'elles occupent tout l'espace de la fenetre principale (nommée racine) et ça fonctionne.
    Dc il faut obligatoirement que tout l'espace de la fenetre principale (ici nommée racine) soit occupée
    Ok, nickel.

    Que veux tu dire par des exemples moins complexes?
    Pourquoi mon bout de code est complexe?

    Je recherche surtout des exemples avec des classes et pas seulement des scripts.

    Enfin derniere question.
    si j'essaye de placer un bouton sur une de mes 2 Frame, cette derniere prend les dimensions du bouton, est ce normal?

    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
     
    import Tkinter #>> oblige a une syntaxe pointee: plus claire
     
    class gui(Tkinter.Tk):
     
    	# le constructeur
    	def __init__(self, parent):
     
    		# appel au constructeur de la classe parente
    		Tkinter.Tk.__init__(self, parent)
    		# garder une ref de notre "parent"
    		self.parent= parent
     
    		# appel a la methode d'initialisation
    		self.initialize()
     
    	# Les methodes
    	def initialize(self):
    		self.presentation()
     
    	def presentation(self):
     
    		# creation et ajout d'un layout_manager sur self (equivalent a la racine)
    		self.grid()
     
    		# creation et ajout d'un widget Frame sur le layout_manager
    		self.frm_01= Tkinter.Frame(self, width= 400, height= 600, relief= "solid", bg= 'red', bd= 1) # creation ds le self (equivalent a racine)
    		self.frm_01.grid(row= 0, column= 0, sticky= "N") # disposition sur le layout_manager
     
    		# creation et ajout d'un second widget Frame sur le layout_manager
    		self.frm_02= Tkinter.Frame(self, width= 400, height= 600, relief= "solid", bg= 'blue', bd= 1) # creation ds le self (equivalent a racine)
    		self.frm_02.grid(row= 0, column= 1, sticky= "N") # disposition sur le layout_manager
     
    		# creation et ajout d'un layout_manager sur frm_01
    		self.frm_01.grid()
     
    		# creation et ajout d'un widget Button
    		self.btn_01= Tkinter.Button(self.frm_01, text= "Catalogue")
    		self.btn_01.grid(row= 0, column= 2, sticky= "S") #
     
    # Corps principal du programme
     
    if __name__== "__main__":
     
    	# instanciation de la classe, aucun parent car c'est la fenetre de base
    	racine= gui(None)
     
    	# attributs de la fenetre principale (racine)
    	racine.geometry("800x600+10+ 100")
    	racine.title("racine= root (de la classe gui)")
     
    	# on boucle sur l'appli
    	racine.mainloop()

    Merci pour les réponses, Perchman ou qqu' un d'autre.
    a+
    areuh

  4. #4
    Membre régulier Avatar de perchman
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 199
    Points : 90
    Points
    90
    Par défaut
    Je ne savais pas que tu voulais des classes à tout prix, sinon, je pense qu'il est assez simple !! J'entendais par simple le fait d'utliser une fenetre avec à l'interieur juste de quoi faire des tests avec des frames et des boutons pour bien saisir le principe !!


    Sinon, pour palier à ton problème de bouton, tu peux donner une dimension à ton bouton !!! (je ne sais pas s'il existe une autre solution)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b11=Button(f1,width=257,height=400,text='test',font=('Chiller',15))
    f est mon frame !!

    j'ai pas le temps de tester, mais ça doit marcher

    Bon courage

    Perchman

    PS: je pars en WE donc pas internet pendant 2 jours

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut,

    Perchman,

    Aprés cette réponse je mettrai un [RESOLU], le problème d'origine étant réglé, mais bon... je trouve pas les solutions satisfaisantes quoi qu'il soit un peu logique (peut-être) de DEVOIR occuper tout l'espace de la fenetre principale (nommée "racine" dans mon cas vous vous en rappellez)

    Perchman, Désolé mais si tu lis correctement, je n'ai aucun problème de Button mais de Frame qui se redimensionne automatiquement à son contenu (je vais tester avec "resizable", je viens de le voir sur un exemple).

    Sinon en ce qui concerne la taille des boutons: une question:
    Je définis une taille de 50 par 50 pour le bouton et celui-ci est plus grand que mes Frame (je ne plaisante pas) alors que mes Frame ont un "height" de 600.
    D'ou vient cette "incompréhension", les tailles boutons s'expriment elles en % par rapport à la taille de leur contenant ou qque chose ds le genre..?

    Voili, voilou,

    De mémoire, je ne me rappelle pas avoir autant galéreé avec Java (j' en ai fait 3 mois , il y a + de 5 ans), je vais peut-être voir du côté de wxpython pour les interfaces graphiques, je vais peut-être continuer avec Tkinter, je sais pas trop

    Ah oui, question qui a son importance... est il possible de trouver un dictionnaire des méthodes de chaque classe python? Avec Java je sais qu'on les trouve sur Google. C'est dispo avec Python qque part?

    Merci bien
    a+
    areuh

  6. #6
    Membre régulier Avatar de perchman
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 199
    Points : 90
    Points
    90
    Par défaut
    Pour ton problème de boutton, je comprends pas trop ce qu'il peut bien se passer pour que le bouton soit plus grand...

    Je ne peux pas t'aider plus


    Bonne journée

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut,

    Perchman,

    pour eviter qu'une Frame se redimensionne par rapport à son contenu, il y a la methode grid_propagate(0).

    J'ai testé, ça fonctionne.

    voili, voilou.
    a+
    areuh

  8. #8
    Membre régulier Avatar de perchman
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 199
    Points : 90
    Points
    90
    Par défaut
    merci pour le renseignement !!!


  9. #9
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    bonsoir,

    pourquoi ne pas utiliser tout simplement la méthode "place" pour mettre en forme ton interface.
    C'est vrai que "grid" n'est pas trés flexible.

    ou regardes aussi du coté de "pack"

    a+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Airod,

    Pourquoi grid()?

    j'ai une toute petite experience de la programmation.
    Je m'y suis remis il y a à peine 3 semaines, 1 mois mais je voulais reprendre avec les classes.
    Pour apprendre et bien "visualiser" la chose, je me suis mis à rechercher des exemples de GUI à partir de classes.
    Je suis tombé sur 2, 3 pages intéressantes (à mon avis). L'une d'entre elles préconisait d'apprendre le layout_manager grid().

    Etant donné que je ne compte pas (position à revoir peut être) apprendre toutes les methodes pour disposer les éléments graphiques d'une GUI, j'ai décidé de suivre le conseil cité plus haut.

    Après une toute petite réflexion (le temps de rédiger cette réponse): pack() me semble moins souple que grid() pour la simple raison que cette dernière dispose (contrairement à pack(), du moins il me semble) d'arguments.

    La méthode place(): IL ME SEMBLE avoir lu que celle-ci place les éléments graphiques en dur (tu as besoin de définir le x et y de chaque élément) et dans le cadre d'un utilisateur qui redimensionne la fenetre de l'appli, cette méthode n'est pas conseillée.

    En résumé c'est d'abord les différents concepts inhérents aux classes qui m'intéressent, mais je ne conçois pas d'apprendre sans GUI. J'apprends dc une seule manière de placer mes éléments, j'essaye ensuite les classes et tout le tra la la, ensuite viendra sans doute le temps de revenir sur le choix de "comment placer pile poil au mm prés mes widgets.

    Ma démarche te semble t elle logique? des Critiques? tu confirmes, tu infirmes?

    Si tu veux bien m'expliquer les différents avantages et inconvénients de chacune de ces 3 méthodes, je t'en serai reconnaissant.

    Merci bien Airod.
    a+
    areuh_fr

  11. #11
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    salut, tu vas rire sans doute mais perso je suis un grider (j'utilise que grid dans mes appli)

    je te parlé des deux autres moyens de placement par rapport a ton problème ci haut.
    Ta démarche est trés saine a mon avis, c'est bien comme ca que l'on apprend le mieux a ce que je sais. Une chose a la fois pour bien comprendre et aprés on explore les autres possibilité.


    Pack a aussi des arguments !!

    ex : w.pack(expand=1)

    amicalement

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    salut,

    et dire qu'apres la publi de mon précédent post, j'allais te citer:
    "Heureux ceux qui se libèrent de leurs chaines"
    c'est vrai que je n'ai pas encore tout compris avec grid(), je vais explorer ça ds qques temps. Mais pour le moment ça me convient.

    A moins que tu ne m'expliques comment tu t'en sers............:-)

    a+
    areuh

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 776
    Points : 2 145
    Points
    2 145
    Par défaut
    Bonjour,
    je me permet de faire remonter se poste car il a soulevé une question. Je suis en train de lire le livre de monsieur Gérard Swinnen eet je vois que lui etend ces classes avec Frame, alors qu'ici c'est TKinter.Tk. Il y a une différence entre les deux? Si par exemple on fait une classe désitiné a être intégré dans une autre comme une interface laquelle vaut il mieux prendre?

  14. #14
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Une fois qu'on a corrigé quelques erreurs du code de ton premier post, il fait exactement ce que tu voulais qu'il fasse.

    1 - Un affreux mélange tabulations espaces.
    2 - Il y a un espace: racine.geometry("800x600+10+ 100")
    3 - self.frm_01.grid(row= 0, column= 0, sticky= "N")

    "N" n'est pas une chaine valide, c'est soit Tkinter.N, soit "n". Mais là tu places vers le haut. Si tu veux placer vers le haut et à gauche, c'est "nw''. A noter que placer un Frame vide n'a pas grand intérêt. Frame sert plutôt à regrouper de vrais widget au niveau du placement.

    salut, tu vas rire sans doute mais perso je suis un grider (j'utilise que grid dans mes appli)
    Tout pareil!

    A+

    Pfeuh

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

Discussions similaires

  1. 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
  2. Réponses: 5
    Dernier message: 06/10/2009, 22h01
  3. [Tkinter] Comment insérer une Frame dans une Frame ?
    Par THE_VIP dans le forum Tkinter
    Réponses: 2
    Dernier message: 30/04/2006, 22h15
  4. [Tkinter] Comment effacer le contenu d'une frame?
    Par Dam22 dans le forum Tkinter
    Réponses: 7
    Dernier message: 28/04/2006, 11h36
  5. [Tkinter] image dans un Frame
    Par THE_VIP dans le forum Tkinter
    Réponses: 7
    Dernier message: 26/04/2006, 14h01

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