Использование filedialog — как бы я изменил размер изображения

#python #tkinter

#python #tkinter

Вопрос:

У меня возникла проблема с изменением размера изображения с помощью filedialog.

 from PIL import Image, ImageTk

def fileDialog(self):
    self.filename = filedialog.askopenfilename(title="Select file")
    self.label = tk.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.resized_img = self.img.resize((200, 100))

    self.photo = ImageTk.PhotoImage(file=self.resized_img)
    self.display = tk.Label(image=self.photo)
    self.display.grid(row=0)
  

Причина, по которой я делаю это внутри функции filedialog, заключается в том, что я не знаю имя файла, который будет выбран, пока пользователь не нажмет на файл. Я делаю Image.open(self.filename) , потому filename что содержит имя файла, на который пользователь нажимает при открытии файлового браузера. Однако я получаю эти ошибки. Я не хочу этого делать open('car.jpg') , потому что это может быть другая картинка, вот почему я это делаю open('self.filename') .

 Traceback (most recent call last):
File "C:UsersAppDataLocalProgramsPythonPython37- 
32libtkinter__init__.py", line 1705, in __call__
return self.func(*args)
File "gui.py", line 41, in fileDialog
self.photo = ImageTk.PhotoImage(file=self.resized_img)
File "C:UsersAppDataLocalProgramsPythonPython37-32libsite- 
packagesPILImageTk.py", line 94, in __init__
image = _get_image_from_kw(kw)
File "C:UsersAppDataLocalProgramsPythonPython37-32libsite- 
packagesPILImageTk.py", line 64, in _get_image_from_kw
return Image.open(source)
File "C:UsersAppDataLocalProgramsPythonPython37-32libsite- 
packagesPILImage.py", line 2661, in open
prefix = fp.read(16)
   AttributeError: 'Image' object has no attribute 'read'
   Exception ignored in: <function PhotoImage.__del__ at 0x03A63B70>
    Traceback (most recent call last):
   File "C:UsersAppDataLocalProgramsPythonPython37-32libsite- 
  packagesPILImageTk.py", line 123, in __del__
   name = self.__photo.name
  AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'
  

Есть ли причина, по которой я получаю эту ошибку? Пожалуйста, посоветуйте.

Ответ №1:

Вы должны удалить file= в PhotoImage

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

file= требуется имя файла, а не объект Image()

effbot.org : Фотоизображение

Комментарии:

1. у pillow есть ImageFilter и SHARPEN , но, вероятно, нет идеального способа сохранить его четким. Некоторые ученые создают модели / инструменты машинного обучения для ее решения