Проблема с миниатюрами с Filedialog Python - PullRequest
0 голосов
/ 22 апреля 2019

У меня проблема с self.photo = ImageTk.PhotoImage(self.resized_img).Это говорит мне, что AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'.Я делаю это неправильно с помощью функции миниатюр?

 def fileDialog(self):
    self.filename = filedialog.askopenfilename(title="Select file")
    self.label = ttk.Label(self.labelFrame, text = "")
    self.label.grid(column = 1, row = 2)
    self.label.configure(text=os.path.basename(self.filename))

    self.img = Image.open(self.filename)

    self.thumbNail_img = self.img.thumbnail((512, 512))

    self.photo = ImageTk.PhotoImage(self.thumbNail_img)
    self.display = ttk.Label(image=self.photo)
    self.display.place(relx=0.10, rely=0.10)

Ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
 File "gui.py", line 44, in fileDialog
self.photo = ImageTk.PhotoImage(self.resized_img)
  File "C:\Users\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PIL\ImageTk.py", line 113, in __init__
mode = Image.getmodebase(mode)
  File "C:\Users\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PIL\Image.py", line 326, in getmodebase
return ImageMode.getmode(mode).basemode
  File "C:\Users\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PIL\ImageMode.py", line 56, in getmode
return _modes[mode]

1 Ответ

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

Попробуйте

print(type(self.img), type(self.thumbNail_img)) 

и вы видите

<class 'PIL.JpegImagePlugin.JpegImageFile'> <class 'NoneType'>

Это означает, что self.img равно Image, но self.thumbNail_img равно None

thumbnail() не создает новое изображение. Он изменяет исходное изображение в self.img и возвращает None.
Работает "in-place". Документ: Изображение. Эскиз

Таким образом, вы должны использовать self.img, чтобы отобразить его

 self.img = Image.open(self.filename)

 self.img.thumbnail((512, 512))

 self.photo = ImageTk.PhotoImage(self.img)

Если вам нужно оригинальное изображение, тогда вы можете .copy() it

 self.img = Image.open(self.filename)

 self.thumbNail_img = self.img.copy()

 self.thumbNail_img.thumbnail((512, 512))

 self.photo = ImageTk.PhotoImage(self.thumbNail_img)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...