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 :

[AttributeError]:module, réouverture sans erreur


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [AttributeError]:module, réouverture sans erreur
    Bonsoir, en ce moment je dois travailler sur un jeu sous python utilisant Tkinter.

    Le jeu a un menu principal fgmain.py, un menu d'exercices fgMenuPC.py, et un exercice fgExTime.py.
    Voilà fgmain raccourci:

    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
     
    from tkinter import*
    import fgMenuPC
     
     
    def PlayMenuPC():
        '''lance le menu des exercices de physique'''
        fenetre.destroy()
        fgMenuPC.MenuPC()
     
    #fenetre
     
    #bouton pour lancer le menu des exercices
    PCButtPic=PhotoImage(file ="PCButtPic.gif")
    PCButt=Button(fenetre, image=PCButtPic,command=PlayMenuPC)
    PCButt.place(x=600,y=200)
     
     
    fenetre.mainloop()
    fgMenuPC raccourci :

    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
     
     
    from tkinter import*
    import fgExTime
     
     
    def MenuPC():
        '''Menu des exercices de physique'''
        def PlayExTime():
            fenetre.destroy()
            fgExTime.ExTime()
     
        #fenetre
        #bouton pour lancer l'exercice
        TimeButt=Button(fenetre, text="dilatation du temps",bg="white",command=PlayExTime)
        TimeButt.place(x=650,y=200)
        fenetre.mainloop()
    fgExtime très raccourci:

    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
     
    from tkinter import*
    import random
     
    def ExTime():
        '''exercice '''
        def replay():
            '''relance le jeu'''
        def ExTimeEnd():
            '''fenetre de fin de jeu'''
            ReplayEnd=Button(PopupEnd, text="rejouer",command=replay)
            ReplayEnd.place(x=700,y=350)
        def ExTimeCheck(a,b,c):
            '''verifie les reponses''' 
            ExTimeEnd()
        def ExTimeSpeed():
            '''les reponses'''
            submit=Button(canvas,text="valider",command=lambda r1=answer,r2=TimeM,r3=FrameSpeed:ExTimeCheck(r1,r2,r3))
            submit.place(x=700,y=500)
     
        #Fenetre
     
        #bouton pour commencer le jeu
        play=Button(canvas, text="jouer",command=ExTimeSpeed)
        play.place(x=700,y=420)
     
        fenetre.mainloop()

    Si mon jeu s'arrête là, il n'y a pas de problème.

    Il apparait quand j'ajoute à la fin de l'exo, un bouton pour retourner au menu principal. Voici les modifications réalisées:
    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
     
     
    from tkinter import*
    import fgMenuPC
     
    def Menu():
        def PlayMenuPC():
            '''lance le menu des exercices de physique'''
            fenetre.destroy()
            fgMenuPC.MenuPC()
        #bouton PC
        PCButtPic=PhotoImage(file ="PCButtPic.gif")
        PCButt=Button(fenetre, image=PCButtPic,command=PlayMenuPC)
        PCButt.place(x=600,y=200)
     
        fenetre.mainloop()
     
    Menu()
    et :

    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
     
     
    from tkinter import*
    import random
    import fgmain
     
    score=0
    Q=10
     
    def ExTime():
        '''exercice dilatation du temps'''
     
        def BackMenu():
            '''retourner au menu'''
            global score
            global Q
            score=0
            Q=10
     
            ScoreLab.config(text=["Score:",score])
            QLab.config(text=["Question:",Q])
     
            fenetre.destroy()
     
            fgmain.Menu()
     
        def replay():
     
            ExTime()
     
        def ExTimeEnd():
                ReplayEnd=Button(PopupEnd, text="rejouer",command=replay)
                ReplayEnd.place(x=700,y=350)
     
                ReturnMenuEnd=Button(PopupEnd, text="menu des matieres",command=BackMenu)
                ReturnMenuEnd.place(x=700,y=450)
     
        def ExTimeCheck(a,b,c):
                ExTimeEnd()
     
        def ExTimeSpeed():
            submit=Button(canvas,text="valider",command=lambda r1=answer,r2=TimeM,r3=FrameSpeed:ExTimeCheck(r1,r2,r3))
            submit.place(x=700,y=500)
     
     
        ReturnMenu=Button(canvas, text="menu des matieres",command=BackMenu)
        ReturnMenu.place(x=660,y=450)
     
        answer = DoubleVar()
        play=Button(canvas, text="jouer",command=ExTimeSpeed)
        play.place(x=700,y=420)
     
     
        fenetre.mainloop()
    Après avoir écrit les lignes pour que le jeu fasse cela, quand je lance fgmain et que j'appuie sur le bouton qui appelle fgMenuPC:

    -AttributeError: module 'fgMenuPC' has no attribute 'MenuPC'

    -je ferme donc la fenêtre, mais elle s'ouvre de nouveau automatiquement

    -quand je clique de nouveau sur le bouton qui appelle fgMenuPC, tout marche parfaitement.

    N.B Désolée, j'ai essayé d'être concise mais le post reste quand même très long. J'espère au moins avoir été clair...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 276
    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 276
    Points : 36 761
    Points
    36 761
    Par défaut
    Salut,

    Ce que vous racontez est fort surprenant... mais sans pouvoir reproduire le problème, pas facile d'imaginer la bêtise que vous avez bien pu faire. Cela dit, comme vous utilisez .mainloop(), .destroy() sur un objet "fenetre" qui ne montre pas ce qu'il est, mon petit doigt me dit que c'est probablement par là qu'il faut chercher.
    Donc la question est "comment et où ces objets "fenetre" sont ils crées?".

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

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour, merci pour la réponse rapide.

    Pour chaque script, j'ai défini les fenêtres dans les fonctions "principales". Celles-ci contiennent des fonctions qui détruisent les fenêtres si elles sont appelées. Cela pose-t-il problème?
    Par ailleurs, je viens de remarquer que le problème se pose lorsque je lance le jeu depuis fgmain mais pas depuis fgExTime...

    Voilà les scripts raccourcis mais testables :
    fgmain :
    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
     
    from tkinter import*
    import fgMenuPC
     
    def Menu():
     
        def PlayMenuPC():
            '''lance le menu des exercices de physique'''
            fenetre.destroy()
            fgMenuPC.MenuPC()
     
        #fenetre
        fenetre=Tk()
        fenetre.title("menu matieres")
        canvas = Canvas(fenetre, width=1400, height=700,bg="black")
        canvas.pack()
     
        #bouton PC
        PCButt=Button(fenetre, text="exercices de physique",bg="white",command=PlayMenuPC)
        TimeButt.place(x=650,y=200)
     
        #start la boucle tkinter, stop a la fermeture fenetre
        fenetre.mainloop()
     
    Menu()
    fgMenuPC

    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
     
    from tkinter import*
    import fgExTime
     
    def MenuPC():
        '''Menu des exercices de physique'''
        def PlayExTime():
            fenetre.destroy()
            fgExTime.ExTime()
     
        #fenetre
        fenetre=Tk()
        fenetre.title("menu physique-chimie exercices")
        canvas = Canvas(fenetre, width=1400, height=700,bg="black")
        canvas.pack()
     
        #bouton dilatation du temps
        TimeButt=Button(fenetre, text="dilatation du temps",bg="white",command=PlayExTime)
        TimeButt.place(x=650,y=200)
     
     
        #start la boucle tkinter, stop aÂ* fermeture fenetre
        fenetre.mainloop()
    fgExtime :

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    from tkinter import*
    import random
     
    import fgmain
     
    score=0
    Q=10
     
    def ExTime():
        '''exercice dilatation du temps'''
        def BackMenu():
            '''retourner au menu'''
            global score
            global Q
            score=0
            Q=10
            ScoreLab.config(text=["Score:",score])
            QLab.config(text=["Question:",Q])
     
            fenetre.destroy()
     
            fgmain.Menu()
     
        def replay():
            global score
            global Q
            score=0
            Q=10
     
            ScoreLab.config(text=["Score:",score])
            QLab.config(text=["Question:",Q])
     
            fenetre.destroy()
     
            ExTime()
     
        def ExTimeEnd():
                '''fenetre de fin de jeu'''
                global score
     
                PopupEnd=LabelFrame(canvas,text="Fin du jeu",height=700,width=1400)
                PopupEnd.place(x=0,y=0)
     
                ScoreLabEnd=Label(PopupEnd,text=("Score:",score))
                ScoreLabEnd.place(x=700,y=250)
     
                ReplayEnd=Button(PopupEnd, text="rejouer",command=replay)
                ReplayEnd.place(x=700,y=350)
     
                ReturnMenuEnd=Button(PopupEnd, text="menu des matieres",command=BackMenu)
                ReturnMenuEnd.place(x=700,y=450)
     
        def ExTimeCheck(a,b,c):
            '''compare la reponse de l'utilisateur au temps calcule'''
            global Q
            global score
     
     
            if a.get()==b:
                CheckLab=Label(canvas,text="Bravo : +1 point")
                CheckLab.place(x=600,y=450)
                score+=1
     
            elif a.get()!=b:
                 CheckLab=Label(canvas,text=("-1 point. La bonne reponse est",b))
                 CheckLab.place(x=600,y=450)
                 score-=1
     
            #modifier l'etiquette du score et du nombre de questions
            ScoreLab.config(text=["Score:",score])
            Q-=1
            QLab.config(text=["Question:",Q])
     
            #si Q>0, generer de nouvelles valeurs
            if Q>0:
                c.destroy()
                ExTimeSpeed()
     
            #sinon lancer la fonction de fin de jeu
            elif Q==0:
     
                ExTimeEnd()
     
     
        def ExTimeSpeed():
     
            '''genere la vitesse, coeff entre par l'utilisateur'''
            popup.destroy()
            ReturnMenu.destroy()
            play.destroy()
     
            #celerite de la lumiere
            lux=300000000
     
            #Temps propre
            TimeProper=random.uniform(1.00,100.00)
            TimeProper=round(TimeProper,2)
            TimeProperLab=Label(canvas,text=("Le temps propre est:",TimeProper))
            TimeProperLab.place(x=600,y=200)
            SpeedFormat=random.randint(1,2)
     
            if SpeedFormat==1:
                #vitesse sous forme de fraction de la celerite
                speedraw=random.uniform(0.1,0.9)
                speedraw=round(speedraw,2)
                FrameSpeed=Label(canvas,text=(speedraw,"c"))
                FrameSpeed.place(x=600,y=300)
     
                #calcul du temps mesure
                speed=speedraw*lux
                RappSpeed=(speed**2)/(lux**2)
                coeff=1/((1-RappSpeed)**0.5)
                TimeM=TimeProper*coeff
                TimeM=round(TimeM,2)
            else:
                #vitesse en m/s (v> c/10 pour variation de 1% entre TimeP et TimeM)
                speedraw=random.randint(200000000,290000000)
                speedraw=round(speedraw,2)
                FrameSpeed=Label(canvas,text=(speedraw,"m/s"))
                FrameSpeed.place(x=600,y=300)
                RappSpeed=(speedraw**2)/(lux**2)
                coeff=1/((1-RappSpeed)**0.5)
                TimeM=TimeProper*coeff
                TimeM=round(TimeM,2)
            #entree de la reponse
            ImputLab=Label(canvas,text="quel est le temps mesure?")
            ImputLab.place(x=600,y=400)
     
            Imput=Entry(canvas, textvariable=answer)
            Imput.place(x=600,y=500)
     
            #bouton valider, lancement du comparateur reponses
            submit=Button(canvas,text="valider",command=lambda r1=answer,r2=TimeM,r3=FrameSpeed:ExTimeCheck(r1,r2,r3))
            submit.place(x=700,y=500)
     
     
        #Fond
        fenetre=Tk()
        fenetre.title("Exercice dilatation du temps")
        canvas = Canvas(fenetre, width=1400, height=700,bg="black")
        canvas.pack()
     
        #compteur de point
        ScoreLab=Label(canvas,text=("Score:",score),bg="white",font=("Courier",20))
        ScoreLab.place(x=670,y=600)
     
     
        #compteur de question
        QLab=Label(canvas,text=("Question:",Q),bg="white",font=("Courier",20))
        QLab.place(x=650,y=550)
     
     
        #menu de l'exercice
        popup=Label(canvas,text=("Temps propre et temps mesure"),bg="white",fg="black",height=10,borderwidth=20)
        popup.place(x=600,y=300)
     
        ReturnMenu=Button(canvas, text="menu des matieres",command=BackMenu)
        ReturnMenu.place(x=660,y=450)
     
        answer = DoubleVar()
        play=Button(canvas, text="jouer",command=ExTimeSpeed)
        play.place(x=700,y=420)
     
        fenetre.mainloop()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 276
    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 276
    Points : 36 761
    Points
    36 761
    Par défaut
    Salut,

    Supprimez "import fgmain" dans fgExTime.

    Pour le reste, je ne sais quoi trop vous dire:
    - la structure de votre code est atypique car on évite les "import en boucle".
    - votre utilisation de tkinter est très "border line". Généralement, on doit avoir un Tk() dans tout le programme le reste étant des Toplevel() (fenêtres secondaires) ou des Frame() (qui servent à construire ce qu'on va placer dans une fenêtre principale ou secondaire).
    Si vous voulez faire des "fonctions" plutôt qu'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def Menu():
     
        def PlayMenuPC():
            '''lance le menu des exercices de physique'''
            fenetre.destroy()
            fgMenuPC.MenuPC()
     
        #fenetre
        fenetre=Tk()
        ...
        #start la boucle tkinter, stop a la fermeture fenetre
        fenetre.mainloop()
    Ecrivez un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def Menu(root):
     
        def PlayMenuPC():
            '''lance le menu des exercices de physique'''
            fenetre.quit()
     
     
        #fenetre
        fenetre=Frame(root)
        ...
        #start la boucle tkinter, stop a la fermeture fenetre
        fenetre.mainloop()
        fenetre.destroy()
        return ...
    Puis vous avez un truc appelant qui va créer la fenêtre principale (root) et la passer aux différentes fonctions qui lorsqu'elles se terminent retournent une information disant quelle fonction appeler pour la suite.
    Et comme vous avez un "boss" qui contrôle la séquence de menu à lancer, cette hiérarchie élimine le besoin des import circulaires *et* la nécessité pour chaque menu de connaître le suivant (c'est le boss qui sait).

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2016, 20h34
  2. comment faire un group by sans erreur
    Par phpaide dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 09h11
  3. Restaurer ma Base sans Erreur???
    Par touhami dans le forum Connexion aux bases de données
    Réponses: 9
    Dernier message: 08/03/2006, 17h04
  4. Intaller module Perl sans Connection Internet
    Par doderic dans le forum Modules
    Réponses: 2
    Dernier message: 16/02/2006, 18h53
  5. REquete sans erreur sql qui n'agit pas ........
    Par Skam dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/02/2005, 13h41

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