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 :

Taille d'une page Toplevel avec un canevas [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Taille d'une page Toplevel avec un canevas
    Bonjour,
    je m'entraine sur petit programme Memory qui fonctionne parfaitement.
    Le problème que je rencontre c'est que la page du jeu ne se reconfigure pas automatiquement à la taille du canevas.
    Je m'explique:
    - si au démarrage on sélectionne 'Grand', puis 'Jeu', on ouvre la page-2 à la bonne taille
    - ensuite 'Menu'
    - si l'on garde la taille du focus, 'Petit', puis 'Jeu', la page-2 est restée à la taille précédente, et l'on voit le cadre du canevas 'Petit'

    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
    # -*- coding: utf-8 -*- 
     
    from tkinter import *
     
    def clean_exit():
        root.destroy()
     
    def alternate_window(is_in_root, is_in_window, window):
        def alternate_processing():
            if is_in_root and not is_in_window:
                #page Jeu
                root.withdraw()
                window.deiconify()
            else:
                #page Menu
                window.withdraw()
                root.deiconify()
                selection()
        return alternate_processing #??
     
    def create_window(window):
        button = Button(window, text="Menu",font='Arial 12', command=alternate_window(False, True, window))
        button.grid(row=5,column=1)
        window.protocol("WM_DELETE_WINDOW", clean_exit)
     
    def taille_jeu():
         if rValue.get()==1:
            WIDTH=200
            HEIGHT=200
         elif rValue.get()==2:
            WIDTH=350
            HEIGHT=350
         else:
            WIDTH=500
            HEIGHT=500
         Canvas(page_2,width=WIDTH,height=HEIGHT,bg='red').grid(row=0,columnspan=2)
     
    def selection():
        global rValue
        rValue = IntVar()
        rValue.set(1)
        trame2=LabelFrame(root,text='Taille du jeu',padx=50)
        trame2.grid(row=5,columnspan=2,sticky='ew')
        root.grid_columnconfigure(0, weight=1)
        rdio_jeu1 = Radiobutton(trame2,font='Arial 12', text='Petit',
                                 variable=rValue, value=1,command=taille_jeu) 
        rdio_jeu2 = Radiobutton(trame2, text='Moyen',font='Arial 12',
                                 variable=rValue, value=2,command=taille_jeu) 
        rdio_jeu3 = Radiobutton(trame2,font='Arial 12' ,text='Grand',
                                 variable=rValue, value=3,command=taille_jeu)
        rdio_jeu1.grid(column=0, row=6,sticky='w')
        rdio_jeu2.grid(column=0, row=7,sticky='w')
        rdio_jeu3.grid(column=0, row=8,sticky='w')
        taille_jeu()
     
    #-----------------Debut du programme------------------    
     
    if __name__ == "__main__":
        root=Tk()
        root.geometry("400x200")
        root.title('Menu')
        page_2=Toplevel(root,bg='white',bd=20)
        btn1=Button(root, command=alternate_window(True, False, page_2),font='Arial 12', text="Jeu")
        btn1.grid(column=0, row=9,sticky='we')
        btn2=Button(root,font='Arial 12',text='Quitter',command=root.destroy)
        btn2.grid(column=1, row=9,sticky='we')    
        btn1.columnconfigure(0,weight=1)
        btn2.columnconfigure(1,weight=1)
        create_window(page_2)
        page_2.withdraw()
        page_2.title('Jeu')
     
        selection()#prepare la page avec les focus des radio-boutons initiaux
        root.mainloop()
    Question subsidiaire : que retourne la ligne 20 'return alternate_processing' de la fonction 'def alternate_window'
    Si je fais un print(return alternate_processing), j'obtiens une seule fois ces messages,
    <function alternate_window.<locals>.alternate_processing at 0x0000025FC2585A20>
    <function alternate_window.<locals>.alternate_processing at 0x0000025FC2585AB0>
    bien que l'on l'utilise à chaque fois que l'on clique sur 'Jeu'

    Lorsque tout fonctionnera, j'intégrerai le tout dans des classes pour éviter les variables globales
    Merci d'avance pour votre aide
    Cordialement

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

    Je ne comprends pas trop vos questions: vous avez écrit ce code ou pas?

    taille_jeu ajoute un canvas a chaque appel ("ajoute" sans détruire l'ancien...) donc "grand" puis "petit" affichent "grand" et "petit" au dessus (et la taille de la fenêtre sera suffisante pour afficher "grand").
    => mettez des couleurs différentes pour le visualiser.

    alternate_window est utilisé pour passer la fonction à appeler à un Button via: command=alternate_window(False, True, window). Donc alternate_window(False, True, window) doit retourner une fonction (c'est ce qu'indique le "print"). Techniquement, une fonction qui retourne une fonction s'appelle "closure" (on fait la même chose - associer fonction et objets - avec lambda et/ou des classes).

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Taille d'une page Toplevel avec un canevas,suite
    Bonjour,

    Je ne comprends pas trop vos questions: vous avez écrit ce code ou pas?
    Oui j'ai écrit le code complet du jeu mais je vous ai mis que la partie affichage qui pose problème

    taille_jeu ajoute un canvas a chaque appel ("ajoute" sans détruire l'ancien...) donc "grand" puis "petit" affichent "grand" et "petit" au dessus (et la taille de la fenêtre sera suffisante pour afficher "grand").
    J'ai compris en faisant un print du canvas qui me donne en effet :
    .!toplevel.!canvas
    .!toplevel.!canvas2
    .!toplevel.!canvas3
    .!toplevel.!canvas4
    Par contre j'ai galéré pour trouver la solution sur le net. On parle de .delete('all') mais je pense que c'est pour les widgets d'un canevas.
    La solution qui fonctionne pour moi est de faire un .destroy()

    alternate_window est utilisé pour passer la fonction à appeler à un Button via: command=alternate_window(False, True, window). Donc alternate_window(False, True, window) doit retourner une fonction (c'est ce qu'indique le "print"). Techniquement, une fonction qui retourne une fonction s'appelle "closure" (on fait la même chose - associer fonction et objets - avec lambda et/ou des classes).
    J'ai trouvé ce complément d'information :
    https://techvidvan.com/tutorials/clo...ts%20execution.

    Merci pour votre aide
    Cordialement

  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 776
    Points
    36 776
    Par défaut
    Citation Envoyé par PLUB_85 Voir le message
    Par contre j'ai galéré pour trouver la solution sur le net. On parle de .delete('all') mais je pense que c'est pour les widgets d'un canevas.
    La solution qui fonctionne pour moi est de faire un .destroy()
    Il y a plein de solution: le plus simple pourrait être de changer la dimension du Canvas existant.

    Oui j'ai écrit le code complet du jeu mais je vous ai mis que la partie affichage qui pose problème
    N'oubliez pas que lorsque vous postez pour demander de l'aide, le code sert à savoir quel est votre niveau (et se mettre à votre niveau pour vous répondre). Normalement, recopier du code sur le Net c'est bien lorsqu'on n'a pas à y toucher sinon, il faut avoir le niveau de celui qui l'a écrit (on gagne du temps à ne pas le coder soi-même).

    - 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. VB6: Récupération des meta d'une page HTML avec HTMLDocument
    Par Matounet dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 22/09/2011, 07h55
  2. Réponses: 16
    Dernier message: 16/08/2006, 15h24
  3. Ouvrir une page Web avec le navigateur
    Par BB85_TIGRIS dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 17/12/2005, 09h45
  4. Son dans une page Web avec Firefox
    Par diod dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 02/12/2005, 17h49
  5. Réponses: 7
    Dernier message: 14/09/2005, 10h50

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