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 :

problème d'affichage d'un objet dans un canvas


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut problème d'affichage d'un objet dans un canvas
    Bonsoir, j'ai codé un échiquier et une fonction censée créer un objet et l'afficher dans cet échiquier. Problème: lorsque j'appelle cette fonction l'image n'apparait pas
    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
    from Tkinter import*
     
     
     
    echiquier=Tk()
    Largeur = 400
    Hauteur = 400
     
     
    Canevas = Canvas(echiquier, width=Largeur, height=Hauteur)
    Canevas.pack()
    for i in range(9):
            if i%2==0:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50)
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150)
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250)
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350)
     
            else:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0)
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100)
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200)
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300)
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350,width=1, fill="#D3D3D3")
     
     
     
     
    def create_image(x,y,z):
     
            image = PhotoImage(file=z)
            Canevas.create_image(x,y,image)
     
     
    echiquier.mainloop()
    dans la console si je rentre par exemple create_image(25,25,tour.gif) la tour ne s'affiche pas.
    Merci de votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Salut,

    tu ne peux pas appeller ta fonction dans la console tant que ton interface tk() tourne.

    A cause du root.mainloop()

    Valentin

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

    Citation Envoyé par pragm Voir le message
    dans la console si je rentre par exemple create_image(25,25,tour.gif) la tour ne s'affiche pas.
    Ca ne s'affiche pas car l'objet Photoimage sera détruit à la sortie de la fonction.... Et pour les solutions, prenez le temps de faire connaissance avec la FAQ.

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

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    j'ai modifié le programme
    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
    from Tkinter import*
     
     
     
    echiquier=Tk()
    Largeur = 400
    Hauteur = 400
     
     
    Canevas = Canvas(echiquier, width=Largeur, height=Hauteur)
    Canevas.pack()
    for i in range(9):
            if i%2==0:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50)
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150)
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250)
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350)
     
            else:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0)
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100)
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200)
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300)
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350,width=1, fill="#D3D3D3")
     
     
     
     
    def create_image(x,y,z):
            z=imgfile
            image = PhotoImage(file=imgfile)
            Canevas.create_image(x,y,image)
            gifsdict[imgfile]=image
     
    gifsdict={}
    echiquier.mainloop()

    ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from Tkinter import *
    from echiquier import *
    from os import*
     
     
     
     
    create_image(25,25,"tour.gif")
    ça ne marche pas

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

    Citation Envoyé par pragm Voir le message
    ça ne marche pas
    Si le programme posté est complet, l'image ne va s'afficher que si les instructions de la fonction "create_image" sont exécutées....
    Et comme cette fonction là n'est pas appelée, pourquoi/comment imaginez vous que çà puisse "marcher"?

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Je pensais qu'en écrivant create_image(25,25,"tour.gif") j'appelais la fonction.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pragm Voir le message
    Je pensais qu'en écrivant create_image(25,25,"tour.gif") j'appelais la fonction.
    Il ne suffit pas de l'écrire, il faut que l'interpréteur exécute cette fonction.
    Et comme l'instruction from echiquier import * ne se terminera qu'à la sortie de echiquier.mainloop(), elle n'est jamais exécutée...
    Ce que constaterez par vous même en ajoutant un "print ('toto')" juste avant l'appel à cette fonction.

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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    la seule solution est d'appeler la fonction dans le fichier echiquier.py?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pragm Voir le message
    la seule solution est d'appeler la fonction dans le fichier echiquier.py?
    Il y a plein d'autres solutions.
    Mais apprendre à programmer avec Tkinter et en plus vouloir répartir son code dans différents modules, c'est vouloir cumuler les difficultés pour bien se prendre les pieds dedans...
    Dans un premier temps, le plus simple est de tout mettre dans le même script... Puis lorsque votre code "fonctionne" et devient "volumineux", il sera temps de voir comment le découper en modules/classes/...

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

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    je crée un dictionnaire contenant les positions des pièces, je crée une boucle dans le fichier echiquier.py pour afficher chaque pièce, j'ai cette erreur:

    File "D:\echiquier.py", line 39, in <module>
    image=PhotoImage(file=[cle][2])
    IndexError: list index out of range

    position_pieces_echec.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    position_pieces={"tour_noir":[25,25,"tour_noir.gif"],"tour_blanche":[50,50,"tour_blanche.gif"]}
    echiquier.py
    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
    from Tkinter import*
    from position_pieces_echec import*
     
     
    echiquier=Tk()
    Largeur = 400
    Hauteur = 400
     
     
    Canevas = Canvas(echiquier, width=Largeur, height=Hauteur)
    Canevas.pack()
    for i in range(9):
            if i%2==0:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50)
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150)
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250)
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350)
     
            else:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0)
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100)
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200)
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300)
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350,width=1, fill="#D3D3D3")
     
     
     
     
     
     
    for cle in position_pieces.keys():
            image=PhotoImage(file=[cle][2])
     
            Canevas.create_image([cle][0],[cle][1],image=[cle][2])
    echiquier.mainloop()

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

    Citation Envoyé par pragm Voir le message
    je crée un dictionnaire contenant les positions des pièces, je crée une boucle dans le fichier echiquier.py pour afficher chaque pièce, j'ai cette erreur:

    File "D:\echiquier.py", line 39, in <module>
    image=PhotoImage(file=[cle][2])
    IndexError: list index out of range
    Quel est le rapport avec la question initiale?

    Puisque vos "cles" sont des chaînes de caractères, [ cle ] construit une liste avec "cle" pour seul élément. Cette liste là n'ayant qu'un seul élément, normal que [cle][2] se vautre en IndexError.

    Ouvrez un tuto. et prenez le temps d'apprendre à jongler avec les constructions de base...

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

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    j'ai résolu le problème grâce a toi merci beaucoup voici mon code
    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
    from Tkinter import*
    from position_pieces_echec import*
     
     
    echiquier=Tk()
    Largeur = 400
    Hauteur = 400
     
     
    Canevas = Canvas(echiquier, width=Largeur, height=Hauteur)
     
    for i in range(9):
            if i%2==0:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50)
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150)
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250)
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350)
     
            else:
                    Canevas.create_rectangle(i*50,50,(i+1)*50,0)
                    Canevas.create_rectangle(i*50,100,(i+1)*50,50,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,150,(i+1)*50,100)
                    Canevas.create_rectangle(i*50,200,(i+1)*50,150,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,250,(i+1)*50,200)
                    Canevas.create_rectangle(i*50,300,(i+1)*50,250,width=1, fill="#D3D3D3")
                    Canevas.create_rectangle(i*50,350,(i+1)*50,300)
                    Canevas.create_rectangle(i*50,400,(i+1)*50,350,width=1, fill="#D3D3D3")
     
    for cle,valeur in position_pieces.items():
     
            photo = PhotoImage(file = cle)
            Canevas.create_image(valeur[0],valeur[1],image=photo)
            position_pieces[cle] = photo
    position_pieces={}       
    Canevas.pack()
    echiquier.mainloop()

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

Discussions similaires

  1. problème d'affichage de mon Objet Glut dans Qt
    Par proc02 dans le forum GLUT
    Réponses: 4
    Dernier message: 21/06/2014, 23h11
  2. affichage d'un objet dans <logic:iterate
    Par don'de dans le forum Struts 1
    Réponses: 2
    Dernier message: 06/03/2007, 21h31
  3. Réponses: 15
    Dernier message: 04/01/2007, 08h47
  4. [SQL] Problème d'affichage de caractère spéciaux dans une variable chaîne
    Par Kryptonaute dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/08/2006, 08h40
  5. Problème d 'affichage d une grile dans un JLabel
    Par louby dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 26/06/2006, 15h56

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