Можно создать объект изображения до того, как у вас появится файл изображения для отображения, но не так, как вы это делаете.Вам просто нужно создать пустой объект изображения и отслеживать идентификатор объекта изображения, а затем перенастроить этот объект внутри 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)