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

Python Discussion :

debutant essaye tkinter pour passer son petit jeux en mode graphique


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut debutant essaye tkinter pour passer son petit jeux en mode graphique
    Bonjour.
    J'essaye d'éclater mon code en morceaux mais je ne comprend pas pourquoi je n'arrive pas à afficher mon sprite du moment que je découpe mon code à l'aide d'une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import *
     
    def affichage(): 
        photo_wall = PhotoImage(file = "wall.gif")
        can.create_image (0, 0, anchor = NW, image = photo_wall)
     
    fenetre = Tk()
    can = Canvas(fenetre, width=500, height=500)
    can.pack()
     
    affichage()
    fenetre.mainloop
    Merci.

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

    Citation Envoyé par ptitnoob
    je ne comprend pas pourquoi je n'arrive pas à afficher mon sprite du moment que je découpe mon code à l'aide d'une fonction.
    Parce qu'avec Python tout est objet et que certains objets (comme une PhotoImage) doivent avoir une durée de vie supérieure à celle de la fonction qui les crée.
    Le même code, avec une seule ligne déplacée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import *
     
    def affichage(): 
        can.create_image (0, 0, anchor = NW, image = photo_wall)
     
    fenetre = Tk()
    photo_wall = PhotoImage(file = "wall.gif")
    can = Canvas(fenetre, width=500, height=500)
    can.pack()
     
    affichage()
    mainloop()
    fait de "photo_wall" une variable globale. L'objet associé reste référencé qu'affichage soit appelé ou pas.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut merci
    J'avais essayé plusieurs choses mais à force je me suis un peut perdu.
    je voulais retourné à la fin de la fonction mon objet mais je ne savais pas ce qu'il fallait renvoyer exactement.
    Du coup grâce à ta réponse j'ai pu voir comment restructurer le code comme je voulais le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from tkinter import *
     
    def affichage(): 
     
        photo_wall = PhotoImage(file = "wall.gif")
        can.create_image (0, 0, anchor = NW, image = photo_wall)
        return ({"wall" : photo_wall})
    fenetre = Tk()
     
    can = Canvas(fenetre, width=500, height=500)
    can.pack()
    fenetre.mainloop
     
    (photos) = affichage()

  4. #4
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par ptitnoob Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from tkinter import *
     
    def affichage(): 
     
        photo_wall = PhotoImage(file = "wall.gif")
        can.create_image (0, 0, anchor = NW, image = photo_wall)
        return ({"wall" : photo_wall})
    fenetre = Tk()
     
    can = Canvas(fenetre, width=500, height=500)
    can.pack()
    fenetre.mainloop
     
    (photos) = affichage()
    Bonsoir,
    Ainsi que l'avait corrigé wiztricks, le "fenetre.mainloop" est une méthode: elle prend une paire de parenthèses.
    Que signifie: "(photos) = affichage()"
    Les parenthèses n'ont pas de sens (et elles n'ont aucun intérêt).
    D'autre part, cette instruction est située après l'affichage graphique (lancé par "fenetre.mainloop()").
    (à la sortie de "mainloop", les objets "tkinter" sont tous détruits)

    Clodion

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut merci
    Oui j'ai oublié les parenthèses pour mainloop(), en faite je commence à voir pour l'interface graphique et la gestion d'événement.
    J'ai suivi des tutos et j'essaye d'éclater mon code et de comprendre le fonctionnement.
    Mais ça coince quand je le découpe.

    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
    from tkinter import * # importation de tkinter
    fenetre = Tk() # création de la fenêtre graphique
    fenetre.title("GAME")
     
    size_sprite = 30 # définit la taille des sprites
    nb_sprite_w = 15
    nb_sprite_h = 15
     
    w_fenetre = nb_sprite_w * size_sprite
    h_fenetre = nb_sprite_h * size_sprite
    can = Canvas(fenetre, width = w_fenetre, height = h_fenetre, bg = "white")
     
    def clavier(event):
        touche = event.keysym
        if touche == 'a':
            print("good")
        else:
            print(touche)
     
    # contenant le niveaux
    lab = [
        "###############",
        "#  #  #     # #",
        "#  ## #-###-# #",
        "#  |    #     #",
        "#-#######     #",
        "#  #    #     #",
        "#  #    #     #",
        "#  ##-###     #",    
        "#             #",
        "#             #",
        "#             #",    
        "#             #",  
        "#             #",
        "#             #",
        "################"
        ]
     
    # chargement des sprites
    photo_wall = PhotoImage(file = "wall.gif") 
    photo_hero = PhotoImage(file = "hero.gif")
     
    n_ligne = 0 # création d'un compteur pour connaitre le n° ligne   
    for ligne in lab:
        n_colonne = 0 # création d'un compteur pour pour connaitre le n° colonne
        for case in ligne:
        # Murs
            if case == "#":
                can.create_image(n_colonne * size_sprite,
                                     n_ligne * size_sprite, anchor = NW,
                                     image = photo_wall)
     
     
            n_colonne += 1 # incrementation compteur n° ligne
        n_ligne += 1       # incrementation compteur n° colonne
     
        # affichage du personnage
        sprite_hero = can.create_image(pos_perso[0] * size_sprite,
                                     pos_perso[0] * size_sprite, anchor = NW,
                                     image = photo_hero)
     
        can.focus_set()
        can.pack () # Positionnement du canevas dans la fenêtre principal 
     
     
    ######################
    # Initialisation jeu #
    ######################
    perso = "x"
    pos_perso = [1, 1]
     
     
     
     
    can.bind("<Key>", clavier)    
    fenetre.mainloop ()
    fenetre.destroy ()

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut la j'essaye de le découper
    Merci pour vos réponses.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut besoin d'explication svp
    Je ne comprend pas pourquoi lorsque je lance mon programme.
    1) le perso s'affiche bien au bonne coordonnées [4,4]
    2) puis lors de l'appui sur la touche de déplacement, le perso s'afiche en [0, 0]
    3) mais ensuite la gestion dévénement et l'affichage fonctionne comme il faut puisque le personnage se déplace bien a droite ou en bas à chaque appui sans erreur de position.

    J'ais vu sur des tutos ce genre de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fenetre.after(50, init_touche)
    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
    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
    import os
    import sys
    from tkinter import * # importation de tkinter
     
    def chargement_lab(nom):
        """
           Charge le labyrinthe depuis le fichier nom.txt
     
           nom : nom du fichier contenant le labyrinthe (sans l'extension .txt)
     
           valeur de retour : une liste contenant les données du labyrinthe
        """
        try:
            fic = open(nom + ".txt", "r")
            data = fic.readlines()
            fic.close()
        except IOError:
            print("Impossible de lire le fichier {}.txt".format(nom))
            exit (1)
        for  i in range(len(data)):
            data[i] = data[i].strip()
     
        return data
     
    def affichage_lab(level, fenetre, size_sprite, pos_perso):
        """
           Affiche le labyrinthe
     
           level : variable contenant le labyrinthe
           can : création d'une zone graphique où afficher les sprites
     
           valeur de retour : bibliothèques contenants les images des sprites
        """
        nb_sprite_w_lab = 30
        nb_sprite_h_lab = 30
     
     
        # création d'une zone graphique où dessiner
        can = Canvas(fenetre, width = (nb_sprite_w_lab  * size_sprite - 1),
                              height = (nb_sprite_h_lab * size_sprite - 1), bg = "white")
     
        # chargement des sprites
        photo_wall = PhotoImage(file = "wall.gif")
        photo_coffre = PhotoImage(file = "coffre.gif")
        photo_hero = PhotoImage(file = "hero.gif")
     
        n_ligne = 0 # création d'un compteur pour connaitre le n° ligne   
        for ligne in level:
            n_colonne = 0 # création d'un compteur pour pour connaitre le n° colonne
            for case in ligne:
            # Murs
                if case == "#":
                    # affichage du sprite wall
                    can.create_image(n_colonne * size_sprite, n_ligne * size_sprite,
                                     anchor = NW,image = photo_wall)
                if case == "§":   
                    # affichage du sprite coffre
                    can.create_image(n_colonne * size_sprite, n_ligne * size_sprite,
                                     anchor = NW,image = photo_coffre)
     
                n_colonne += 1 # incrementation compteur n° ligne
            n_ligne += 1       # incrementation compteur n° colonne
     
            # affichage du sprite hero
        hero = can.create_image(pos_perso[0] * size_sprite,
                         pos_perso[0] * size_sprite, anchor = NW,
                         image = photo_hero)
        can.focus_set()
        can.pack()
        return (can, hero, {"wall" : photo_wall,
                 "coffre" : photo_coffre,
                 "hero" : photo_hero})
     
    def test_deplacement():
        """
        """
     
     
    def init_touches(event): # gestionnaire d'événements
        """
     
        """
        touche = event.keysym
        p = pos_perso
        print (">>>", pos_perso, p) 
        if touche == 'd': # déplacement à droite       
            p [0] += 1
            print(pos_perso, p)
            canvas.coords(hero, p[0], p[1])
        if touche == 's': # déplacement en bas      
            p [1] += 1
            print(pos_perso, p)
            canvas.coords(hero, p[0], p[1])       
        else:
            print("none")
     
     
    ######################
    # Initialisation jeu #
    ######################
     
    # Initialisation des paramètres
    perso = "X"
    pos_perso = [4, 4]
    size_sprite = 30 # définit la taille des sprites
     
    # Initialisation de l'affichage graphique
    fenetre = Tk()
    fenetre.title("GAME")
     
    # Lancement de la partie
    level = chargement_lab("lvl_1")
    (canvas, hero, photos) = affichage_lab(level, fenetre, size_sprite, pos_perso)
    fenetre.bind("<Key>", init_touches)
     
    # Boucle événementielle
    fenetre.mainloop()
    fenetre.destroy()
    j'utilise des sprites de 30 * 30 pixels (wall.gif , hero.gif , coffre.gif)
    le code de mon fichier.txt contenant le labyrinthe lvl_1.txt

    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
    ##############################
    #                            #
    #                            #
    #                            #
    #                            #
    #             §              #
    #                            #           
    #                            #
    #                            #
    #                            #
    #                            #          
    #                            #           
    #                            #
    #                            #
    #                            #
    #                            #
    #                            #
    #                            #
    #                            #
    #                            #           
    #                            #
    #                            #
    #                            #
    #                            #          
    #                            #           
    #                            #
    #                            #
    #                            #
    #                            #
    ##############################

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut trouvé
    J'ai relu mon code est j'ai compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Initialisation des paramètres
     
    size_sprite = 30 # définit la taille des sprites
    perso = "X"
    pos_perso = [4 * size_sprite, 4 * size_sprite]
    Pareil pour le déplacement de sprites en sprites:


Discussions similaires

  1. Collaboration pour création de petits jeux
    Par Xydwix dans le forum Unity
    Réponses: 5
    Dernier message: 26/05/2015, 22h28
  2. Moyens minimum pour un accès via ssh en mode graphique - X11 - à un serveur
    Par FrancisGernet dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 17/12/2014, 03h26
  3. petit jeux pour essayer
    Par phoenix_91 dans le forum VB.NET
    Réponses: 19
    Dernier message: 10/06/2007, 22h06
  4. Réponses: 9
    Dernier message: 12/03/2007, 15h09
  5. [debutant] pour debbuger un petit prog avec menu
    Par niluge01 dans le forum Windows
    Réponses: 3
    Dernier message: 22/11/2003, 14h03

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