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 :

Éviter la superposition de Frame Tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Lycée
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycée

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Par défaut Éviter la superposition de Frame Tkinter
    Bonjour,

    J'écris ici, car je rencontre un problème dans mon programme (et je n'ai plus assez d'ingrédients pour faire une potion d'épiphanie). Je souhaite réaliser un petit programme afin d'impressionner mes collègues (également sorcier en herbe) qui m'afficherai un menu et qui me permettrai de choisir en cliquant sur un bouton de changer de Frame afin d'afficher la recette de potion souhaitée. Sauf que...eh bien, les cadres que j'ai créés se superposent faisant un cafouillis impossible (même une potion de méli-mélo n'en fait pas autant). Afin de résoudre ce problème j'ai essayé diverses fonctions comme :frame.reset(), frame.forget(), en vain...

    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
     
    from tkinter import *
    from tkinter import ttk
     
    LARGEFONT =("Verdana", 35)
     
    def next_frame(frame):
        #frame.reset()
        frame.tkraise()
     
    root = Tk()
     
    f1 = Frame(root, bg='#0059b3')
    f2 = Frame(root, bg='#0059b3')
    f3 = Frame(root, bg='#0059b3')
    f4 = Frame(root, bg='#0059b3')
     
    #frame_lst=[f1,f2,f3,f4]
     
    for frame in (f1, f2, f3, f4):
        frame.grid(row=0, column=4, sticky='n')
     
     
    Label(f1, text='Menu des potions', bg='#0059b3', font=LARGEFONT).pack()
    Label(f1, text=' ', bg='#0059b3').pack()
    Button(f1, text='alller pg 2', command=lambda:next_frame(f2)).pack()
     
    Label(f2, text='FRAME 2').pack()
    Button(f2, text='alller pg 3', command=lambda:next_frame(f3)).pack()
     
    Label(f3, text='FRAME 3').pack(side='left')
    Button(f3, text='alller pg 4', command=lambda:next_frame(f4)).pack(side='left')
     
    Label(f4, text='FRAME 4').pack()
    Button(f4, text='alller pg 1', command=lambda:next_frame(f1)).pack()
     
    root['bg'] = '#0059b3'
    root.minsize(width=500, height=750)
    root.maxsize(width=500, height=750)
    root.mainloop()
    Aperçu du rendu :
    Nom : menu potion.jpg
Affichages : 793
Taille : 18,9 Ko

    Je vous conjure, ô grands sorciers de l'informatique de voler à mon secours.

    -S-

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

    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for frame in (f1, f2, f3, f4):
        frame.grid(row=0, column=4, sticky='n')
    toutes les frames s'empilent dans la même case (row=0, column=4).

    Si ce n'est pas ce que vous voulez... pourquoi le coder?

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

  3. #3
    Membre du Club
    Homme Profil pro
    Lycée
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycée

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Par défaut
    toutes les frames s'empilent dans la même case (row=0, column=4).

    Si ce n'est pas ce que vous voulez... pourquoi le coder?
    Le problème, c'est qu'il me sert à changer de cadres. Car, si je ne le fais pas cela me place les Frames les unes en dessous des autres (ce que je ne souhaite pas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for frame in (f1, f2, f3, f4):
        frame.grid( padx =50, pady=50)
    Aperçu :

    Nom : menu potion 2.jpg
Affichages : 757
Taille : 23,3 Ko

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

    Citation Envoyé par S apprenti sorcier Voir le message
    Le problème, c'est qu'il me sert à changer de cadres.
    Si vous voulez empiler les frames, il faudrait qu'elles aient les mêmes dimensions pour que la frame du dessous ne soit plus visible.

    Sinon, pour afficher une seule Frame à la fois, il va falloir définir la Frame courante (celle qui s'affiche) et ne plus l'afficher (.grid_forget ou .grid_remove) avant d'afficher la suivante.

    Choisissez votre croix...

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

  5. #5
    Membre du Club
    Homme Profil pro
    Lycée
    Inscrit en
    Avril 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycée

    Informations forums :
    Inscription : Avril 2022
    Messages : 8
    Par défaut
    Bonsoir,

    J'ai rajouté une nouvelle définition afin d'effacer ma Frame mais un message d'erreur s'affiche m'indiquant que je ne peut répéter "command" même si c'est pour une définition différente. Je me demandais donc comment résoudre ce problème, car, si je décide de le regrouper dans une seule définition comment faire en sorte que le programme puisse se dire : "C'est la Frame n°1 d'affichée et comme l'utilisateur à décidé d'appuyer sur le bouton pour changer de Frame, je dois la supprimer et mettre la Frame n°2"(peut-être en assignant une valeur à la Frame correspondante ? -> par exemple : Frame 1 = 1, Frame 2 = 2...)


    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
     
    from tkinter import *
    from tkinter import ttk
     
    LARGEFONT =("Verdana", 35)
     
    def next_frame(frame):
        frame.tkraise()
     
    def erase_frame(frame):
        frame.grid_forget()
     
     
    for frame in (f1, f2, f3, f4):
        frame.grid(row=0, column=4, sticky='n')
     
     
    root = Tk()
     
    f1 = Frame(root, bg='#0059b3')
    f2 = Frame(root, bg='#0059b3')
    f3 = Frame(root, bg='#0059b3')
    f4 = Frame(root, bg='#0059b3')
     
    #frame_lst=[f1,f2,f3,f4]
     
     
     
     
    Label(f1, text='Menu des potions', bg='#0059b3', font=LARGEFONT).pack()
    Label(f1, text=' ', bg='#0059b3').pack()
    Button(f1, text='alller pg 2', command=lambda:erase_frame(f1), command=lambda:next_frame(f2)).pack()
     
    Label(f2, text='FRAME 2').pack()
    Button(f2, text='alller pg 3', command=lambda:erase_frame(f2), command=lambda:next_frame(f3)).pack()
     
    Label(f3, text='FRAME 3').pack(side='left')
    Button(f3, text='alller pg 4', command=lambda:erase_frame(f3), command=lambda:next_frame(f4)).pack(side='left')
     
    Label(f4, text='FRAME 4').pack()
    Button(f4, text='alller pg 1', command=lambda:erase_frame(f4), command=lambda:next_frame(f1)).pack()
     
    root['bg'] = '#0059b3'
    root.minsize(width=500, height=750)
    root.maxsize(width=500, height=750)
    root.mainloop()
    -S-

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

    Citation Envoyé par S apprenti sorcier Voir le message
    Je me demandais donc comment résoudre ce problème, car, si je décide de le regrouper dans une seule définition comment faire en sorte que le programme puisse se dire : "C'est la Frame n°1 d'affichée et comme l'utilisateur à décidé d'appuyer sur le bouton pour changer de Frame, je dois la supprimer et mettre la Frame n°2"(peut-être en assignant une valeur à la Frame correspondante ? -> par exemple : Frame 1 = 1, Frame 2 = 2...)
    Dès que vous partez à écrire f1, f2, f3, ... il faut penser "collection d'objets".
    La collection de base est la liste.

    Si à la place des f1, f2, f3,... on a une liste frames, on pourra utiliser un indice pour accéder aux différentes Frame: frames[0], frames[1], frames[2],...

    Au départ, on affiche la Frame d'indice 0 qu'on mémorise dans une variable V, la frame suivante sera celle d'indice (V + 1) modulo le nombre d'objets, d'éléments de la liste frames.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/07/2013, 10h17
  2. Comment éviter l'utilisation des frames
    Par Ani[MAL] dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 21/04/2008, 16h49
  3. [HTML] superposition de frames html
    Par edouard21 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 07/09/2006, 15h05
  4. [Tkinter] image dans un Frame
    Par THE_VIP dans le forum Tkinter
    Réponses: 7
    Dernier message: 26/04/2006, 14h01
  5. [Tkinter] Canvas -> superposition et z-index ?
    Par Olivier_ dans le forum Tkinter
    Réponses: 3
    Dernier message: 02/12/2005, 09h05

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