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 :

Fonction avancer


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Fonction avancer
    Bonjour, je suis débutante en tkinter. Je n'arrive pas à faire avancer mon carré ( perso ) , il avance et recule , donc reste dans la même place . j'explique un peu le but de mon jeux. Le 'carrée' va devenir un personnage qui doit se déplacer pour attraper les 'pommes' mais ne doit pas toucher les rectacles ( qui ne sont pas présent dans ce code ) Voici mon code :
    merci

    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
    from tkinter import *
    from random import randrange
    def nouveau_jeu():
        a=0
    def rectangle():
        d=0
        b=2
        c=10
        while d<3:
           can1.create_rectangle(10+c, 10+c, 100+c, 100+c)
           d=d+1
           c=c+100
    def pomme(): #ce quelle va manger, pomme aléatoire
        a=0
        x=randrange(840)
        y=randrange(480)
        i=0
        i2=0
        while i<rectangle:
            i2=1
    def perso(): #personnage
        global dx, dy, x, y, nana, direction
        nana=can1.create_rectangle(20,20,50,50)
     
    def avant(event):
        global dx, dy, nana, direction
        can1.delete(nana)
        direction=1
        dx=0
        dy=-10
        nana=can1.create_rectangle(20+10, 20, 50+10, 50+10)
    def gauche(event):
        global dx, dy, nana
        can1.delete(nana)
        direction=2
        dx=-10
        dy=0
        nana=can1.create_rectangle(20+dx, 20+dy, 50+dx, 50+dy)
    def droite(event):
        global dx, dy, nana
        can1.delete(nana)
        direction=3
        dx=10
        dy=0
        nana=can1.create_rectangle(20+dx, 20+dy, 50+dx, 50+dy)
        direction=0
    def bas(event):
        global dx, dy, nana
        can1.delete(nana)
        dx=0
        dy=10
        nana=can1.create_rectangle(20+dx, 20+dy, 50+dx, 50+dy)
     
    fen1=Tk()
    fen1.title("SUPER NANA ! :D")
    can1= Canvas (fen1, bg='blue', height=480, width=840)
    can1.grid(row=0, column=0, rowspan=10)
    can1.bind_all("<Up>", avant)
    can1.bind_all("<Right>", droite)
    can1.bind_all("<Down>", bas)
    can1.bind_all("<Left>", gauche)
    Button(fen1, text="Nouveau Jeu", font=("ComicSansMS"), command=perso).grid(row =4, column=1, sticky=N, padx=5)
    Button(fen1, text="Quitter", font=("ComicSansMS"),command=fen1.destroy).grid(row =6, column=1, sticky=N)
    x=randrange(840)
    y=randrange(480)
    dx=0
    dy=0
    direction=0
    score=0
    fen1.mainloop()

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

    En voilà un joli chantier!
    Python étant structuré par blocks indentés, sans la balise code, votre prose est illisible.
    Cela étant, votre structure étant simple, on peut quand même raconter des choses sans trop d'efforts.
    Votre principal soucis est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def gauche(event):
        global dx, dy, nana
        can1.delete(nana)
        direction=2
        dx=-10
        dy=0
        nana=can1.create_rectangle(20+dx, 20+dy, 50+dx, 50+dy)
    Relisez ce que çà fait: on détruit le rectangle nana et on en recrée un autre au même emplacement.
    Et oui: 20 et 50 ne changent pas d'un appel à l'autre alors que dx, dy "symbolisent" un déplacement mais ne font que décaler les 20 et 50.
    En gros, on fait du surplace.
    Comble de l'ironie, un item (le rectangle nana) du canvas peut être déplacé via can1.move(nana, dx, dy).
    dx, dy sont alors la valeur du déplacement pour de vrai.
    Déjà, en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def gauche(event):
        global dx, dy, nana
        #can1.delete(nana)
        direction=2
        dx=-10
        dy=0
        can1.move(nana, dx, dy)
    le code est plus proche de ce que vous voulez faire. Il y a des chances que çà le fasse mieux.

    Vous voyez aussi que créer les 4 fonctions: gauche, droite, avant, bas de 5 à 6 lignes aussi semblables est prise de tête!
    Elles se ressemble mais les différences ne sautent pas aux yeux. In fine, vous allez devoir jongler pour savoir.

    En plus gauche, droite, avant, bas sont les callbacks associés aux binds de 'Left', 'Right', 'Up', 'Down'.
    On peut s'en sortir avec des commentaires, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def gauche(event):   # Left
        global dx, dy, nana
        #can1.delete(nana)
        direction=2
        dx=-10               # dx, dy
        dy=0
        can1.move(nana, dx, dy)
    Honnêtement, je préfère essayer de rendre un code plus lisible "sans" avoir à y ajouter des colorants syntaxiques.
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def on_move(event):
        if event.keysym == "Up":
            dx = 0; dy = -10
        elif event.keysym == "Down":
            dx = 0; dy = 10
        elif event.keysym == "Left":
            dx = -10; dy = 0
        elif event.keysym == "Right":
            dx = 10; dy = 0
        can1.move(nana, dx, dy)
    ramasse tout çà en quelques lignes.
    Bon ok, il faudra peut être les changer un peu plus tard. Mais en attendant, ce code est simple à comprendre.
    De proche en proche, si on s'amuse à ne garder que ce qui sert à quelque chose, çà devient une trentaine de lignes:
    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
    from tkinter import *
     
    def perso(): #personnage
        items = can1.find_withtag('nana')
        if not len(items):
            can1.create_rectangle(20,20,50,50,tag='nana')
        else:
            can1.coords('nana', 20,20,50,50)
     
    def on_move(event):
        canvas = event.widget
        print ('event.keysym', event.keysym)
        if event.keysym == "Up":
            dx = 0; dy = -10
        elif event.keysym == "Down":
            dx = 0; dy = 10
        elif event.keysym == "Left":Votr
            dx = -10; dy = 0
        elif event.keysym == "Right":
            dx = 10; dy = 0
        canvas.move('nana', dx, dy)
     
    fen1=Tk()
    fen1.title("SUPER NANA ! ")
     
    can1= Canvas (fen1, bg='blue', height=480, width=840)
    can1.grid(row=0, column=0, rowspan=10)
    can1.focus_set()
    for name in ("<Up>", "<Right>", "<Down>", "<Left>"):
        canvas.bind(name, on_move)
     
    Button(fen1, text="Nouveau Jeu", font=("ComicSansMS"), command=perso).grid(row =4, column=1, sticky=N, padx=5)
    Button(fen1, text="Quitter", font=("ComicSansMS"),command=fen1.quit).grid(row =6, column=1, sticky=N)
    mainloop()
    J'ai la faiblesse de penser que "moins", c'est probablement "mieux".
    Mais ce n'est qu'une proposition, vous faites ce que vous voulez...
    Le but du jeu étant de ne pas se faire envahir, de garder le code sous contrôle.

    Bon courage,
    - W

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Admirative
    Bonjour,

    sa marche ! merci merci

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut recadrage
    J'ai une autre question, pourque mon cadre 'perso' ne sorte pas du canvas, faudrai que je crée une fonction while ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 396
    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 396
    Points : 36 954
    Points
    36 954
    Par défaut
    Citation Envoyé par bellabouh Voir le message
    J'ai une autre question, pourque mon cadre 'perso' ne sorte pas du canvas, faudrai que je crée une fonction while ?
    mauvaise pioche!
    Il faut d'abord commencer par définir des "bords" (exemple: x_min, x_max) a ne pas dépasser et autoriser un déplacement de 'nana' si le résultat reste à l'intérieur.
    Côté "code", si vous ne voulez pas que ce soit le bazar, il va falloir travailler sur les symétries entre les bords (x_min, x_max) et (y_min, y_max) et la symétrie entre le cas *_min et le cas *_max.
    Pour réfléchir, vous pouvez prendre une feuille de papier à carreaux.
    Intuitivement se déplacer à droite ou à gauche de 10 peut être équivalent à se déplacer d'un carreau.
    De toutes façons tant que vous n'avez pas construit une représentation "papier" de ce que çà doit faire, pas la peine d'essayer de coder: vous ne savez pas encore par où commencer.

    - W

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

Discussions similaires

  1. [WD12] Fonction avancée HFILTRE
    Par machou43 dans le forum WinDev
    Réponses: 3
    Dernier message: 04/11/2008, 10h32
  2. Réponses: 1
    Dernier message: 19/03/2008, 14h12
  3. Réponses: 5
    Dernier message: 12/02/2008, 13h58
  4. Réponses: 2
    Dernier message: 25/09/2007, 15h55
  5. Requetes : fonction avancée regroupement
    Par d_pyrenees_a_paris dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2007, 09h33

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