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 :

name 'x' in not defined


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 8
    Points
    8
    Par défaut name 'x' in not defined
    Excusez-moi de vous dérangez à nouveau Bistouille et Wiztricks...
    Je viens encore une fois à propos d'un problème vis-à-vis de mon jeu Flappy Bird.

    En effet, j'ai suivi vos conseils et j'ai donc repris mon programme à zéro afin de l'améliorer car il était assez illisible et pour mieux gérer les déplacements
    J'ai ainsi à peu près réécris tout mon programme et je l'ai mieux organiser grâce à des variables... (vous me direz ce que vous en pensez au passage )

    Sauf qu'encore une fois, je me retrouve confronter à une erreur mais assez différente de d'habitude à propos de la variable correspondant à l'ordonnée de l'oiseau : oisy et j'ai beau retourner le problème dans tout les sens, je ne sais pas d'où vient l'erreur.

    Merci beaucoup pour vos aides sinon, j'en prends bien note à chaque fois !
    PS : Tiens bistouille, juste pour toi, voici une archive zip des images que j'ai utilisé

    Flappy Bird.zip

    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
    from tkinter import *
    import random
    from random import randint
     
    def sauter(event):
        print('sauter')
        for i in range(20 ): 
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)  
           canvas.update(30)
     
    def deplacement():
        global tuyx,tuyx2,h,H,oisx,oisy,solx,sol2x
     
        canvas.coords (image_oiseau,oisx,oisy)
        oisy+=5
     
        canvas.coords(image_sol,solx,512)
        solx-=5
        if solx==-144:
            solx=144
     
        canvas.coords(image_sol2,sol2x,512)
        sol2x-=5
        if sol2x==-144:
            sol2x=432
     
        canvas.coords(image_tuyau_haut,tuyx,h)
        canvas.coords(image_tuyau_bas,tuyx,h-241)
        tuyx-=5
        if tuyx==-28:
            tuyx=316
            h = randint(128,385)
     
        canvas.coords(image_tuyau_haut2,tuyx2,H)
        canvas.coords(image_tuyau_bas2,tuyx2,H-241)
        tuyx2-=5
        if tuyx2==-28:
            tuyx2=488
            H = randint(128,385)
     
    fenetre.after(40,deplacement)
    deplacement()
     
    fenetre = Tk()
     
    #Les variables :
    tuyx=316
    tuyx2=488
    h=randint(128,385)
    H=randint(128,385)
    oisx=67
    oixy=244
    solx=144
    sol2x=432
     
    canvas = Canvas(fenetre, width=286, height=510)
     
    fond = PhotoImage(file="background-day.png")
    fond2 = PhotoImage(file="background-night.png")
    fond=[fond,fond2]
    F= random.choice(fond)
    canvas.create_image(144,256, anchor=CENTER,image=F)
     
    tuyau_haut = PhotoImage(file="tuyau_vers_le_haut.png")
    image_tuyau_haut = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_haut)
    image_tuyau_haut2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_haut)
     
    tuyau_bas = PhotoImage(file="tuyau_vers_le_bas.png")
    image_tuyau_bas = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_bas)
    image_tuyau_bas2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_bas)
     
    sol = PhotoImage(file="sol-day.png")
    image_sol = canvas.create_image(144,512, anchor=S,image=sol)
    image_sol2 = canvas.create_image(432,512, anchor=S,image=sol)
     
    oiseau = PhotoImage(file="yellowbird-midflap.png")
    oiseau2 = PhotoImage(file="bluebird-midflap.png")
    oiseau3 = PhotoImage(file="redbird-midflap.png")
    oiseau=[oiseau,oiseau2,oiseau3]
    O=random.choice(oiseau)
    image_oiseau=canvas.create_image(oisx,244, anchor=W,image=O) 
     
    canvas.pack()
    canvas.focus_set()
    canvas.bind("<space>",sauter) 
     
    fenetre.mainloop()

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Losqu'on a ce genre d'erreur et que pourtant on pense bien avoir déclaré cette variable, on fait une recherche dans le script avec l'éditeur de texte, généralement ctrl + F, en faisant ça, tu constateras que oisy n'a pas été déclaré, car c'est une simple erreur de syntaxe du nom de la variable : oixy=244

    Bon après, il y a encore plein de problèmes, la méthode update de tkinter n'est à utiliser que pour forcer une mise à jour, dans ton script, c'est inutile, pourquoi faire plusieurs déplacements dans ta fonction ?
    Plutôt que d'avoir plein de variables devant être stipulées comme globales dans tes fonctions, il serait judicieux d'utiliser des listes ou encore des dict.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour l'astuce, je ne la connaissais pas et pourtant, elle est très utile !
    Et pour l'erreur de syntaxe... my bad.

    Alors pour le déplacement de l'oiseau, c'est mon professeur qui m'a dit de faire ça afin de rendre le mouvement plus "fluide" .
    Il m'a alors dit de décomposer la fonction en plusieurs déplacements puis d'utiliser la méthode update (il m'a bien sûr expliquer le fonctionnement exactement comme toi) car selon lui, la méthode fonctionne dans cette situation, après il est vrai qu'il m'a dit ne pas être un as de tkinter... (on a tous nos préférences après tout)

    Pour les variables globales, je comprends ce que tu veux dire mais je ne sais pas comment le faire, tu pourrais me montrer ce qu'il faut faire ?

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Pour les variables, c'est simple, au lieu d'utiliser par ex. 2 variables oisx, et oisx, tu peux grouper cela dans une variable position_oiseau[67, 244] où l'indice 0 représente le x, et le 1 le y, et agir sur cette liste pour en modifier la coordonnée.

    En ce qui concerne la fluidité, faire 5 déplacements dans une boucle ne rendra pas l'animation plus fluide, car cela sera exécuté rapidement par tkinter.

    Il y a une petite astuce à connaître pour faire quelque chose de plus fluide, c'est d'utiliser la méthode after afin d'exécuter la fonction de déplacement périodiquement et d'utiliser un flag qui sera modifié si la touche est pressée ou relâchée.

    Exemple très succinct avec ton volatile.

    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 as tk
     
    VITESSE_CHUTE = 2
    ACCELERATION_CHUTE = 1.05
     
     
    def deplacer_oiseau():
        """ Déplace le volatile verticalement """
        global vitesse_chute
        if elevation:
            y = -5
        else:
            # On augmente la vitesse de chute
            vitesse_chute *= ACCELERATION_CHUTE
            y = int(vitesse_chute)
        # déplacement du volatile
        canvas.move(oiseau, 0, y)
        # Relancement du déplacement après 20ms
        canvas.after(20, deplacer_oiseau)
     
     
    def choir_oiseau(evt):
        """ Stipule que le volatile se casse la gueule """
        global elevation
        elevation = False
     
     
    def elever_oiseau(evt):
        """ Stipule que le volatile bat frénétiquement des ailes """
        global elevation, vitesse_chute
        # Initialisation de la vitesse de chute
        vitesse_chute = VITESSE_CHUTE
        elevation = True
     
     
    fenetre = tk.Tk()
     
    canvas = tk.Canvas(fenetre, width=286, height=510)
    canvas.pack()
    canvas.focus_set()
     
    image_oiseau = tk.PhotoImage(file="yellowbird-midflap.png")
    oiseau = canvas.create_image(67, 244, image=image_oiseau)
     
    vitesse_chute = VITESSE_CHUTE
    elevation = False
     
    canvas.bind("<space>", elever_oiseau)
    canvas.bind("<KeyRelease-space>", choir_oiseau)
     
    canvas.after(50, deplacer_oiseau)
     
    fenetre.mainloop()
    Le temps ronge l'amour comme l'acide.

  5. #5
    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,

    Citation Envoyé par Glouber Voir le message
    Alors pour le déplacement de l'oiseau, c'est mon professeur qui m'a dit de faire ça afin de rendre le mouvement plus "fluide".
    Il m'a alors dit de décomposer la fonction en plusieurs déplacements puis d'utiliser la méthode update (il m'a bien sûr expliquer le fonctionnement exactement comme toi) car selon lui, la méthode fonctionne dans cette situation, après il est vrai qu'il m'a dit ne pas être un as de tkinter...
    Ben avant d'utiliser ce genre de méthode, vous devriez (et votre professeur aussi) ouvrir une documentation tkinter et quand çà dit:

    update()

    Cette méthode force le rafraîchissement de l’affichage. Vous ne devriez l’utiliser que si vous savez ce que vous faites puisqu’elle peut conduire à un comportement imprévisible ou à une boucle infinie. Dans tous les cas, elle ne devrait jamais être appelée à partir d’un gestionnaire d’événement ou d’une fonction appelée par un tel gestionnaire.
    il faut expliquer pourquoi vous ne pouvez pas vous en passer.
    (et i vous n'avez pas de bonnes raisons, c'est que vous ne savez pas ce que vous faites...)

    Citation Envoyé par Glouber Voir le message
    Merci beaucoup pour vos aides sinon, j'en prends bien note à chaque fois !
    Je veux bien mais si vous avez des difficultés pour déplacer l'oiseau, vous vous concentrez sur la mécanique de déplacement de l'oiseau.... Et que vous utilisiez une image ou un rectangle n'a pas grande importance:
    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
    from tkinter import *
     
    WIDTH = 286
    HEIGHT = 510
    DY = 5
     
    def sauter(event):
        canvas.move(oiseau, 0, -10*DY)
     
    def deplacement(delay=50):
        x0, y0, x1, y1 = canvas.bbox(oiseau)
     
        if y1 < HEIGHT - DY:
            canvas.move(oiseau, 0, DY)
        canvas.after(delay, deplacement)
     
     
    fenetre = Tk()
     
    canvas = Canvas(fenetre, width=WIDTH, height=HEIGHT)
    x = WIDTH // 3
    y = HEIGHT // 2
    oiseau = canvas.create_rectangle(x, y, x+30, y+30, fill='grey')
     
    canvas.pack()
    canvas.focus_set()
    canvas.bind("<space>", sauter) 
    deplacement()
     
    mainloop()
    Sûr qu'il y a des conditions à ajouter dans déplacement et sauter.... mais la mécanique ne change pas et remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oiseau = canvas.create_rectangle(x, y, x+30, y+30, fill='grey')
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    image = PhotoImage(file="bluebird-midflap.png")
    oiseau = canvas.create_image(x, y, image=image)
    ne présente pas de difficultés...

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

Discussions similaires

  1. NameError: global name 'thread' is not defined
    Par Balbuzard dans le forum Général Python
    Réponses: 6
    Dernier message: 15/07/2009, 06h52
  2. Réponses: 4
    Dernier message: 19/06/2009, 15h23
  3. NameError: name 'nbBug' is not defined
    Par titi_lion dans le forum Général Python
    Réponses: 1
    Dernier message: 15/05/2009, 12h32
  4. NameError: global name 'entr2' is not defined
    Par noquioz dans le forum Tkinter
    Réponses: 18
    Dernier message: 24/11/2008, 11h20
  5. NameError: name 'excel' is not defined
    Par billyrose dans le forum Général Python
    Réponses: 3
    Dernier message: 14/07/2008, 17h37

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