2017-06-16 1 views
0

La commande create_image est montrant une erreur pour le chemin que je suis en train de naviguer pour l'image et passer au paramètre d'image de la commande,Comment afficher une image dans un objet de toile dans tkinter en utilisant le chemin obtenu à partir du navigateur de fichiers

Traceback (most recent call last):
File "C:\Users\SAURAV DAS\AppData\Local\Programs\Python\Python35\projects\classify_gui.py", line 29,
in module cv.create_image(0, 0, image=photo, anchor='nw') AttributeError: 'NoneType' object has no attribute 'create_image'

est-il une autre façon je peux être en mesure de parcourir le chemin de l'image et l'afficher, comme dans

  1. changer la méthode de navigation pour le chemin de l'image
  2. ou, Chan ge la méthode d'affichage de l'image dans l'objet canvas

    J'utilise Python 3.5 sur Windows 10. J'ai installé toutes les bibliothèques pré-requises mentionnées dans le code. Toutes les images utilisées par moi sont dans le répertoire de travail en tant que mon projet.
    S'il vous plaît aider ...

    import sys 
    import tkinter as tk 
    from PIL import Image,ImageTk,ImageFilter,ImageOps 
    
    
    global fname 
    fname = "images.png" 
    
    
    def browse_file(): 
        fname = tk.filedialog.askopenfilename(filetypes=(("Bitmap files", "*.bmp"), ("JPEG files", "*.jpg"), ("PNG files", "*.png"), ("All files", "*"))) 
        print(fname) 
        return 
    
    def classify_obj(): 
        print("In Development") 
        return 
    
    
    root = tk.Tk() 
    root.wm_title("Classify Image") 
    
    broButton = tk.Button(master=root, text='Browse', height=2, width=8, command=browse_file).grid(row=0, column=0, padx=2, pady=2) 
    
    frame1 = tk.Frame(root, width=500, height=400, bd=2).grid(row=1, column=0) 
    im = Image.open(fname) 
    photo = ImageTk.PhotoImage(im) 
    cv = tk.Canvas(frame1, height=390, width=490, background="white", bd=1, relief=tk.RAISED).grid(row=1,column=0) 
    cv.create_image(0, 0, image=photo, anchor='nw') 
    
    claButton = tk.Button(master=root, text='Classify', height=2, width=10, command=classify_obj).grid(row=0, column=1, padx=2, pady=2) 
    
    frame2 = tk.Frame(root, width=500, height=400, bd=1).grid(row=1, column=1) 
    cv = tk.Canvas(frame2, height=390, width=490, bd=2, relief=tk.SUNKEN).grid(row=1,column=1) 
    
    tk.mainloop() 
    
+0

Est-ce que ma réponse à résoudre votre AttributeError? –

+0

oui, c'est vrai. Merci pour cela par le biais –

+0

Allright. Ensuite, veuillez cocher la case verte à côté de ma réponse pour montrer que votre problème a été résolu. –

Répondre

0

Les méthodes du gestionnaire du réseau ne reviendra pas le widget. Ne placez donc pas les méthodes de grille à la fin d'un widget. Au lieu de configurer la grille après la création du widget.

Modifier ceci:

cv = tk.Canvas(frame1, height=390, width=490, background="white", bd=1, relief=tk.RAISED).grid(row=1,column=0) 
cv.create_image(0, 0, image=photo, anchor='nw') 

à ceci:

cv = tk.Canvas(frame1, height=390, width=490, background="white", bd=1, relief=tk.RAISED) 
cv.grid(row=1,column=0) 
cv.create_image(0, 0, image=photo, anchor='nw') 
+0

Merci, ça a marché ... Pouvez-vous m'expliquer pourquoi ma méthode ne fonctionnait pas seulement sur cette commande mais sur toutes les autres commandes. –

+0

Avec 'grid()' à la fin de la création de votre widget à chaque fois que quelque chose tenterait d'interagir avec ce widget, 'grid()' retournerait None. Vous obtenez donc une erreur d'attribut, car la grille ne renvoie aucun attribut. Utiliser '.grid()' à la fin d'un widget est correct tant que vous n'allez pas interagir avec ce widget après sa création. Sinon, vous devez définir la grille après la création du widget. –