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 :

pyimage don't exist


Sujet :

Tkinter Python

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut pyimage don't exist
    Après 9 heures d'essai de correction de bug, je capitule:
    Une methode doit afficher une image de plot dans un Canvas Tkinter.
    Voici mon pseudo code (trop fatiguer):
    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
     
    from Tkinter import *
    import matplotlib as plt
    from PIL import Image, ImageTk
    from random import randint
     
    class Mon_prog () :
     
      def methode_qui_bug(self) :
        #création d'un plot 
        name=str(randint(1000,10000))
        plt.savefig(name)
        plt.close()
        a=Tk()
        b=[Image.open(name+'.png')]
        print 'image raw ok' 
        c=[ImageTk.PhotoImage(image=b[0])]
        print 'image tk ok'
        d=Canvas(a, height=500, width=500)
        print 'canvas created'
        d.create_image(250,250, image=c[0], anchor=CENTER)
        d.pack()
     
    test=Mon_prog()
    fen=Tk()
    bout=Button(fen, text='affiche', command=test.methode_qui_bug)
    bout.pack()
    mainloop()
    a l'exécution sa donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    image raw ok
    image tk ok
    canvas created
    #et puis vient le traceback m'annonçant que le fichier pyimage n'existe pas alors que j'ai pris toutes les mesure de sauvegarde de l'instance.
    j'ai une methode similaire qui emploi les meme fonction d'insertion d'image dans un Canvas qui fonctionne elle.
    Je pense etre victime de hacker qui sont des parasites, pour le monde cybernétique si c'est sans éthique.
    Je pense que ce sont des Lamers de m.... qui ne savent pas écrire une ligne de code pour saboter mon travail car si il le savait ils ne le feraient pas, savant ce que sait...
    Il faut éradiquer ces parasites de la toile meme si je dois me prendre une infraction, j'ai bien fait de la signaler. Car tous ceux qui travail en programmant comprendrai...

  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,

    Dans l'optique ou 'il ne dois en rester qu'un' il est recommandé de n'avoir qu'une instance tk. C'est la raison d'être du toplevel.

    @+

  3. #3
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci d'encore m'avoir botter les fesses, j'ai instancier des Tk() a la place des Toplevel() car je pensais, du moins ce que disais ma doc, il n'y a moins de possibilitées qu'avec une instance de Tk(), mais après vérification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    from Tkinter import *
    a=Tk()
    b=Toplevel()
    b.keys()
    ['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']
    a.keys()
    ['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']
     
    if help(a) == help(b) :
      print 'true'
     
    true
    Ma doc était incomplète.
    Merci encore d'encore m'avoir botter les fesses.

  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
    Pas de quoi.

    Par contre avec ton code tu risque d'avoir quelques accrochages au niveau du plt.close et de la référence à l'image.
    Quelques notes sur ton code donc :
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import matplotlib.pyplot as plt
    from PIL import Image, ImageTk
    import Tkinter as tk # Attention que les autres modules importes aussi tkinter.
    from random import randint
    import numpy as np # Pour faire l'image
     
    class Mon_prog () :
     
        def methode_qui_bug(self) :
            name=str(randint(1000,10000))
            # Pour avoir une image à afficher
            x = np.arange(0, 5, 0.1);
            y = np.sin(x)
            plt.plot(x, y)
            #
            plt.savefig(name)
            #plt.close() # Je te laisse décommanter pour tester
     
            a = tk.Toplevel()
            b = Image.open(name+'.png') 
            c = ImageTk.PhotoImage(b) # Plutôt qu'une liste ou un tuple je préfère l'instance (i.e d.img = c).
            # Je te laisse tester avec la liste, tu vas comprendre.
            d = tk.Canvas(a, width = b.size[0], height = b.size[1])
            d.img = c
            d.create_image(0,0, anchor = tk.NW, image=c)
            d.pack()
     
    test=Mon_prog()
    fen=tk.Tk()
    tk.Button(fen, text='affiche', command=test.methode_qui_bug).pack()
    fen.protocol("WM_DELETE_WINDOW", fen.quit)
    fen.mainloop()
    Si j'ai bien compris c'est pour n'utiliser que l'image ? Sinon pourquoi ne pas utiliser show ?

    Bon code

    Edit pour les imports

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> from Tkinter import *
    >>> from matplotlib.pyplot import *
    >>> dir(Button)
    ['__doc__', '__init__', '__module__', '_click', '_motion', 'disconnect', 'drawon', 'eventson', 'on_clicked']
    >>> print Button
    matplotlib.widgets.Button
    >>> import Tkinter as Tk
    >>> dir(Tk.Button)
    ['_Misc__winfo_getint', '_Misc__winfo_parseitem', '__contains__', '__doc__', '__getitem__', '__init__', '__module__', '__setitem__', '__str__', '_bind', '_configure', '_displayof', '_do', '_getboolean', '_getdoubles', '_getints', '_grid_configure', '_nametowidget', '_noarg_', '_options', '_register', '_report_exception', '_root', '_setup', '_subst_format', '_subst_format_str', '_substitute', '_tclCommands', 'after', 'after_cancel', 'after_idle', 'bbox', 'bell', 'bind', 'bind_all', 'bind_class', 'bindtags', 'cget', 'clipboard_append', 'clipboard_clear', 'clipboard_get', 'colormodel', 'columnconfigure', 'config', 'configure', 'deletecommand', 'destroy', 'event_add', 'event_delete', 'event_generate', 'event_info', 'flash', 'focus', 'focus_displayof', 'focus_force', 'focus_get', 'focus_lastfor', 'focus_set', 'forget', 'getboolean', 'getdouble', 'getint', 'getvar', 'grab_current', 'grab_release', 'grab_set', 'grab_set_global', 'grab_status', 'grid', 'grid_bbox', 'grid_columnconfigure', 'grid_configure', 'grid_forget', 'grid_info', 'grid_location', 'grid_propagate', 'grid_remove', 'grid_rowconfigure', 'grid_size', 'grid_slaves', 'image_names', 'image_types', 'info', 'invoke', 'keys', 'lift', 'location', 'lower', 'mainloop', 'nametowidget', 'option_add', 'option_clear', 'option_get', 'option_readfile', 'pack', 'pack_configure', 'pack_forget', 'pack_info', 'pack_propagate', 'pack_slaves', 'place', 'place_configure', 'place_forget', 'place_info', 'place_slaves', 'propagate', 'quit', 'register', 'rowconfigure', 'selection_clear', 'selection_get', 'selection_handle', 'selection_own', 'selection_own_get', 'send', 'setvar', 'size', 'slaves', 'tkButtonDown', 'tkButtonEnter', 'tkButtonInvoke', 'tkButtonLeave', 'tkButtonUp', 'tk_bisque', 'tk_focusFollowsMouse', 'tk_focusNext', 'tk_focusPrev', 'tk_menuBar', 'tk_setPalette', 'tk_strictMotif', 'tkraise', 'unbind', 'unbind_all', 'unbind_class', 'update', 'update_idletasks', 'wait_variable', 'wait_visibility', 'wait_window', 'waitvar', 'winfo_atom', 'winfo_atomname', 'winfo_cells', 'winfo_children', 'winfo_class', 'winfo_colormapfull', 'winfo_containing', 'winfo_depth', 'winfo_exists', 'winfo_fpixels', 'winfo_geometry', 'winfo_height', 'winfo_id', 'winfo_interps', 'winfo_ismapped', 'winfo_manager', 'winfo_name', 'winfo_parent', 'winfo_pathname', 'winfo_pixels', 'winfo_pointerx', 'winfo_pointerxy', 'winfo_pointery', 'winfo_reqheight', 'winfo_reqwidth', 'winfo_rgb', 'winfo_rootx', 'winfo_rooty', 'winfo_screen', 'winfo_screencells', 'winfo_screendepth', 'winfo_screenheight', 'winfo_screenmmheight', 'winfo_screenmmwidth', 'winfo_screenvisual', 'winfo_screenwidth', 'winfo_server', 'winfo_toplevel', 'winfo_viewable', 'winfo_visual', 'winfo_visualid', 'winfo_visualsavailable', 'winfo_vrootheight', 'winfo_vrootwidth', 'winfo_vrootx', 'winfo_vrooty', 'winfo_width', 'winfo_x', 'winfo_y']
    Comme tu le constate je fais parti du front contre la pollution des namespaces (comprendre from tutu import *)...

    @+

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Je ne peut utiliser plt.show() car je me suis heurter a un problème de boucle: Quand on appuyait sur le bouton lançant le show rien ne se passait mais dès qu'on détruisait la fenetre Tkinter le show faisait son apparition...
    J'ai essayer avec des thread sa ne marchait pas.
    Je suis sous Linux et apparament sa marche sous windows: http://www.developpez.net/forums/d10...-sous-tkinter/

    Je n'ai pas encore essayer après la réforme des Toplevel (merci de ton aide) mais mon plot ne prend pas en charge xlabel(), ylabel & title() alors je reste a mon Canvas.

  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
    Citation Envoyé par Luke spywoker Voir le message
    Je ne peut utiliser plt.show() car je me suis heurter a un problème de boucle: Quand on appuyait sur le bouton lançant le show rien ne se passait mais dès qu'on détruisait la fenetre Tkinter le show faisait son apparition...
    ?
    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
     
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import matplotlib.pyplot as plt
    import Tkinter as tk
    from random import randint
    import numpy as np
     
    class Mon_prog () :
     
        def methode_qui_bug(self) :
            name=str(randint(1000,10000))
            x = np.arange(0, 5, 0.1);
            y = np.sin(x)
            plt.plot(x, y)
            plt.show()
     
    test=Mon_prog()
    fen=tk.Tk()
    tk.Button(fen, text='affiche', command=test.methode_qui_bug).pack()
    fen.protocol("WM_DELETE_WINDOW", fen.quit)
    fen.mainloop()
    Citation Envoyé par Luke spywoker Voir le message
    J'ai essayer avec des thread sa ne marchait pas.
    Je suis sous Linux et apparament sa marche sous windows: http://www.developpez.net/forums/d10...-sous-tkinter/
    L'exemple donné par pfeuh dans ton lien fonctionne très bien...
    Citation Envoyé par Luke spywoker Voir le message
    Je n'ai pas encore essayer après la réforme des Toplevel (merci de ton aide) mais mon plot ne prend pas en charge xlabel(), ylabel & title() alors je reste a mon Canvas.
    Je disais juste que l'écriture d'un fichier disque c'est dommage.

    Bon code

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

Discussions similaires

  1. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55
  2. Check Url pour savoir si erreur 404 ou si le site existe
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/08/2002, 13h49
  3. Existe-t'il un type tenant sur 2 octets ?
    Par benj63 dans le forum C++Builder
    Réponses: 13
    Dernier message: 20/06/2002, 17h03
  4. Existe t'il un composant permettant de jouer un son wav?
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/06/2002, 14h10
  5. Existe-t-il un langage de prog "virtuel" en Français
    Par HRS dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/06/2002, 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