Как отобразить изображение (на холсте), выбранное с помощью filedialog? - PullRequest
0 голосов
/ 24 декабря 2018

Я начал проект несколько дней назад, но, к сожалению, я застрял.Я хотел бы создать редактор изображений (очень простой; D), в котором вы можете выбрать изображение с помощью файла диалога, тогда у меня была бы возможность сделать несколько модификаций, таких как повороты.Моя проблема в том, что я могу выбрать изображение, но как только я это сделал, я не могу показать изображение на холсте.

В нем говорится: «имя« изображение »не определено»

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

from tkinter import *
from PIL import Image, ImageTk
from tkinter import filedialog

root = Tk()

#function to select my image by using the filedialog
def select_image(): 
    file_path = filedialog.askopenfilename()
    image = Image.open(file_path)

#button to press to open filedialog
select = Button(root, text="select an image", command=select_image)
select.pack()

#the canvas where the image will be display
canvas = Canvas(root, width= 100, height=100, bg="grey")
canvas.pack()

image_tk = ImageTk.PhotoImage(image)
canvas.create_image(0,0, image= image_tk)


root.mainloop()

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Можно создать объект изображения до того, как у вас появится файл изображения для отображения, но не так, как вы это делаете.Вам просто нужно создать пустой объект изображения и отслеживать идентификатор объекта изображения, а затем перенастроить этот объект внутри select_image.

Например, не определяйте image_tk в основной программе.Измените строку, которая создает элемент изображения на холсте, следующим образом:

image_id = canvas.create_image(0,0, anchor="nw")

(примечание: без опции anchor центр изображения будет в 0,0. Я предполагаю, что выхотите, чтобы верхний левый угол изображения был 0,0).

Далее, в select_image вы выполняете всю работу по получению изображения, сохраняя ссылку на него (чтобы избежатьон удаляется при возврате функции) и отображается на холсте.Это будет выглядеть примерно так:

def select_image(): 
    # ask the user for the filename
    file_path = filedialog.askopenfilename()

    # only show the image if they chose something
    if file_path:
        # open the file
        image = Image.open(file_path)

        # create the image object, and save it so that it
        # won't get deleted by the garbage collector
        canvas.image_tk = ImageTk.PhotoImage(image)

        # configure the canvas item to use this image
        canvas.itemconfigure(image_id, image=canvas.image_tk)
0 голосов
/ 24 декабря 2018

У вас есть пара проблем:

  1. Вы никогда не вызываете свою функцию!Ваш код игнорирует select_image() после того, как он определен

  2. Переменная image определена только внутри вашей (не вызываемой) функции, поэтому, когда вы пытаетесь использовать ее с помощью ImageTk.PhotoImage(), онане определено.

Попробуйте вернуть объект изображения следующим образом:

from tkinter import *
from PIL import Image, ImageTk
from tkinter import filedialog

root = Tk()

#function to select my image by using the filedialog
def select_image(): 
    file_path = filedialog.askopenfilename()
    return Image.open(file_path)

#button to press to open filedialog
select = Button(root, text="select an image", command=select_image)
select.pack()

#the canvas where the image will be display
canvas = Canvas(root, width= 100, height=100, bg="grey")
canvas.pack()

image_tk = ImageTk.PhotoImage(select_image())
canvas.create_image(0,0, image= image_tk)


root.mainloop()

Обратите внимание, что вы не проверяете ошибки или отмены в функции select_image ().Вам бы лучше обрабатывать отмену или ошибку внутри функции тоже

...