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 :

Erreur affichage d'image


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Erreur affichage d'image
    Bien le bonjour tout le monde, dans mon programme, une erreur apparait a la fermeture de la fenêtre Tkinter :
    Too early to create image.

    Dans la F.A.Q j'ai trouvé ça :

    Comme pour la plupart des toolkit graphique, il est nécessaire en général avant de pouvoir créer des objets Tkinter
    de créer une instance Tk en premier lieu. Ce message d'erreur apparaît classiquement lorsque vous créez un objet
    PhotoImage alors qu'aucune instance Tk n'existe.
    Le problème c'est que mon instance est belle et bien créée.

    Je m'explique :

    Dans mon jeu, le pion se déplace sur des cases, et monte à l'étage supérieur au bout de la pièce. Les déplacements fonctionne bien, c'est dès que je quitte le programme, que s'affiche l'erreur : Too early to create image
    Alors que mon image (le pion) est créé :s

    D'où ma question :

    Existe-t'il une autre raison que "Instance non créé" pour l'erreur "Too early to create image"?

    Merci bien

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Oui, que tu fasse référence à ton image après la fermeture de ta fenêtre. Après le mainloop par exemple.

    @+

    Edit: Erreur de ma part

    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
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
    #
    #
    from Tkinter import *
     
    class testphoto(Tk):
        def __init__(self):
            Tk.__init__(self)
            Label(self, text='Test').pack()
            Button(self, text='Quitter', command = self.quit).pack()
     
    if __name__ == "__main__":
        app = testphoto()
        app.mainloop()
        photo = PhotoImage(file="ZY.gif")
    Ne donne pas l'erreur.

    Est il possible d'avoir du code ?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci bien.

    Ensuite, voici une partie de mon code, ce sont les deux principales fonction.

    Mon instance est jeu=Tk() et mon Canvas principal est dessin.
    L'image qui produit l'erreur est l'image 'pion'. Je la déplace sur les différentes images qui change avec la fonction monter().

    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
    def deplacer() :
        global a,Zx, Zy, casex, casey, itempion
        if X==1 :
            casex=[480, 480, 480, 420, 365, 310, 255, 200, 145, 90, 45, 45, 45]
            casey=[90, 150, 200, 200, 200, 200, 200, 200, 200, 200, 200, 150, 90]
            a=int(de.get()) + a
            if a<len(casex) +1 :
                Zx=casex[a-1]
                Zy=casey[a-1]
                pion=PhotoImage(file="rond.gif")
                itempion=dessin.create_image(Zx, Zy, image=pion)
     
            else :
                monter()
        if X==2 :
            casex=[460, 400, 340, 280, 220, 160, 160, 160, 100]
            casey=[130, 130, 130, 130, 130, 130, 190, 250, 250]
            a=int(de.get()) + a
            if a<len(casex) +1 :
                Zx=casex[a-1]
                Zy=casey[a-1]
                pion=PhotoImage(file='rond.gif')
                itempion=dessin.create_image(Zx, Zy, image=pion)
     
            else :
                monter()
        if X==3 :
            casex=[370, 430, 490, 490, 490, 490, 490]
            casey=[310, 310, 310, 250, 190, 130, 70]
            a=int(de.get()) + a
            if a<len(casex) +1 :
                Zx=casex[a-1]
                Zy=casey[a-1]
                pion=PhotoImage(file='rond.gif')
                itempion=dessin.create_image(Zx, Zy, image=pion)
            else :
                monter ()
     
     
        dessin.mainloop()
     
    def monter() :
        global X,a,item0,item1,item2,item3, boutonI
        global boutonQ, boutonD, label_res, boutonMonter, label_resultat
     
        a=0
        X=X+1
        if X==1 :
                dessin.delete(item0)
                boutonQ.destroy()
                boutonMonter.destroy()
                premier=PhotoImage(file="1er.gif")
                item1=dessin.create_image(256, 192, image=premier)
                boutonD=Button(dessin, text="Lancer le de", command=lancer_le_de)
                boutonD.place(x=270, y=260)
                label_res=Label(dessin, text='Resultat')
                label_res.place(x=280, y=290)
                label_resultat=Label(dessin, textvar=de)
                label_resultat.place(x=340, y=290)
        if X==2 :
                dessin.delete(item1)
                second=PhotoImage(file="2eme.gif")
                item2=dessin.create_image(256, 192, image=second)
        if X==3 :
                dessin.delete(item2)
                troisieme=PhotoImage(file="3eme.gif")
                item3=dessin.create_image(256, 192, image=troisieme)
        if X==4 :
                dessin.delete(item3)
                boutonI.destroy()
                boutonD.destroy()
                label_res.destroy()
                label_resultat.destroy()
                dernier=PhotoImage(file='dernier.gif')
                item4=dessin.create_image(256, 192, image=dernier)
     
        dessin.mainloop()
    Merci bien

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est bien deux dessin.mainloop() que je vois ? Une erreur de copier/coller ?
    Un mainloop pour un Canvas ? C'est une classe dérivée class(Canvas) (et même...) ?
    Sinon ton erreur viens de la structure de ton programme.
    Dans le cadre d'une classe dérivée tu devrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class dessin(Canvas):
        def __init__(self):
            Canvas.__init__(self)
     
    class jeu(Tk):
        def __init__(self):
            Tk.__init__(self)
     
    if __name__ == "__main__":
        app = jeu()
        app.mainloop()
    Dans le cadre d'un Canvas simple c'est dessin = Canvas(self 'ou autre', etc...) (ou self.dessin)

    Donne ta structure pour voir.

    Pour information tu dois avoir une seule instance Tk (et utiliser Toplevel si tu as besoin d'autres fenêtres). Surtout avec PhotoImage qui retourne Too early to create image.

    @+

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Re, merci

    Je ne sais pas ce qu'est une dérivée de classe, je n'en utilise pas. (j'ai commencé Tkinter ya un mois :p)

    les deux dessin.mainloop() ne sont pas une erreur de copier coller, lorsque j'appelle la fonction, ils me permettent, d'après ce que j'ai compris de réactualisez mon canvas et ainsi afficher mes différentes images.

    Cela marche aussi avec jeu.mainloop() (jeu étant mon instance) mais je n'en vois pas la différence.

    Je n'ai bel et bien qu'une seule instance Tk, pas de TopLevel.

    Par contre, comment donner la structure?

    Encore merci

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pour un Widget Canvas tu as :
    .update() qui force la mise à jour.
    .update_idletasks() qui mets à jour avant la fin des events.

    When the first damage event arrives, the canvas registers an idle task (using after_idle) which is used to “repair” the canvas when the program gets back to the Tkinter main loop. You can force updates by calling the update_idletasks method.

    Le .mainloop() sert à (je me lance dans une description perso: Merci de rectifier au cas ou) 'ne pas arrêter le code tant que les évènements de l'utilisateur ne sont pas terminés'.

    Bon code et bienvenu (j'ai commencé Tkinter ya un mois :p)

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oula me reste encore une infinité de chose à apprendre ^^

    Il faut bien commencer un jour, merci

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Citation Envoyé par Frigg Voir le message
    Il faut bien commencer un jour
    Bien sur ! Et tu vas voir, c'est chouette

    Voici ce que je te propose:

    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
    class jeu(Tk):
        def __init__(self):
            Tk.__init__(self)
    ----Ton code
            def deplacer(self) :
    ----Ton code
                else :
                    self.monter()
    ----Ton code
                self.dessin.update()
        
            def monter(self) :
    ----Ton code
                self.dessin.delete(item0)
    ----Ton code
     
    if __name__ == "__main__":
        app = jeu()
        app.mainloop()


    Bon code

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/10/2010, 10h43
  2. [GD] Erreur affichage d'une image PHP
    Par toinou62 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 04/01/2010, 13h47
  3. Erreur d'affichage d'images Acrobat Reader
    Par paulines dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 18/07/2007, 11h37
  4. Erreur d'affichage d'image
    Par ZAYDOUN dans le forum MATLAB
    Réponses: 7
    Dernier message: 19/03/2007, 17h52
  5. Mauvais affichage des images et message d'erreur
    Par SLAM JACK dans le forum Langage
    Réponses: 3
    Dernier message: 29/03/2006, 18h11

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