Как решить ошибку «AttributeError: тип объекта« Изображение »не имеет атрибута« открыть »» в Python? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь отобразить изображение на холсте Tkinter вместе с текстом, и у меня возникает следующая ошибка. Кроме того, мой Mac не отображает цвета фона для кнопок при запуске с помощью Spyder в Anaconda (Spyder обновлен).

Мой код Python:

from tkinter import *  
from PIL import ImageTk,Image  

def plot_best_batsmen():
    best_batsmen = dataset.loc[dataset.loc[dataset['Innings']>=15,'Average'].idxmax(),'Names']
    message = ("The best Batsman of the Tournament could possibly be: ", best_batsmen)
    canvas_width = 500
    canvas_height = 500
    root = Tk()
    root.geometry("600x600")
    root.title("New Window")
    canvas = Canvas(root, width=canvas_width, height=canvas_height)
    canvas.create_text(1, 10, anchor=W, text=message)
    img = ImageTk.PhotoImage(Image.open("prediction.jpg"))
    canvas.create_image(20, 20, anchor=NW, image=img)
    canvas.image = img
    canvas.pack()
    root.mainloop()

При запуске отображается сообщение об ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/anaconda3/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/Users/vivekchowdary/Documents/PS3_Final_Project/Batsmen.py", line 110, in plot_best_batsmen
    canvas.create_image(20, 20, anchor=NW, image=img)
  File "/anaconda3/lib/python3.7/tkinter/__init__.py", line 2489, in create_image
    return self._create('image', args, kw)
  File "/anaconda3/lib/python3.7/tkinter/__init__.py", line 2480, in _create
    *(args + self._options(cnf, kw))))
_tkinter.TclError: image "pyimage3" doesn't exist

Код для кнопок выглядит следующим образом:

b1 = Button(root, text="Elbow Method", command=plot_elbow, bg="green", fg="white").pack(side = LEFT)
b2 = Button(root, text="K-Means Clustering", command=plot_kmeans, bg="blue", fg="white").pack(side = LEFT)
b3 = Button(root, text="Batsmen who scored 4 or more Hundreds", command=plot_hundreds, bg="#D35400", fg="white").pack(side = LEFT)
b4 = Button(root, text="Runs Scored by Various Players", command=plot_runs, bg="#117A65", fg="white").pack(side = LEFT)
b5 = Button(root, text="Best Batsmen", command=plot_best_batsmen, bg="#34495E", fg="white").pack(side = LEFT)
b6 = Button(root, text="Stop", command=root.destroy, bg="red", fg="white").pack(side = BOTTOM)

Я хочу, чтобы Tkinter отобразил следующее изображение. Но вместо этого он сообщает об ошибке. Может кто-нибудь, пожалуйста, помогите мне в решении этой ошибки?

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

tkinter также имеет класс / функцию под названием Image.Вы также импортировали изображение из PIL.Вы должны убедиться, какой Image.open вы пытаетесь использовать.tkinter.Image не имеет атрибута 'open'.

0 голосов
/ 23 апреля 2019

Я сам разобрался с ответом и просто хотел поделиться им, чтобы помочь кому-то с такими же сомнениями.

Нам нужно импортировать PIL после Tkinter, поскольку у Tkinter также есть свой собственный класс Image, который не имеет 'открытая функциональность, и это изображение из Tkinter заменяет изображение из PIL, если оно импортировано после PIL.

и второе, что нужно сделать, это заменить root = Tk() на root = Toplevel(), потому что проблема в том, что когда Python / Tkinter пытается построить холст из кнопки, он по сути пытается создать два окна вroot и падение.

Теперь код импортирует фотографию в графический интерфейс и работает нормально.

Итак, наконец, приведенный ниже код работает нормально: def plot_best_batsmen(): best_batsmen = dataset.loc[dataset.loc[dataset['Innings']>=15,'Average'].idxmax(),'Names'] message = ("The best Batsman of the Tournament could possibly be: ",best_batsmen) canvas_width = 400 canvas_height = 500 root = Toplevel() root.geometry("700x600") root.title("New Window") canvas = Canvas(root, width=canvas_width, height=canvas_height) canvas.create_text(1, 10, anchor=W, text=message) img = ImageTk.PhotoImage(Image.open("virat.jpg")) canvas.create_image(150, 20, anchor=NW, image=img) canvas.image = img canvas.pack() root.mainloop()

0 голосов
/ 22 апреля 2019

похоже, что ошибка не имеет никакого отношения к вашему tkinter. Чтобы определить проблему, пожалуйста, просто

from PIL import Image 
print(Image.open)

результат должен выглядеть следующим образом, если вы все правильно установили.

< function open at 0x0000000008A26488 >
...