Tkinter filedialog функция askopenfilename

Я пытаюсь открыть окно file dialog (выбрать файл), когда пользователь нажимает кнопку, вызывая функцию open:

from Tkinter import *
import Tkinter, Tkconstants, tkFileDialog
from PIL import ImageTk, Image

root = Tk()
root.title('Application')


def open_file():
    root.filename = tkFileDialog.askopenfilename(initialdir="/", title="Select An Image", filetypes=(("jpeg files", "*.jpg"), ("gif files", "*.gif*"), ("png files", "*.png")))
    image_label = Label(root, text=root.filename)
    image_label.pack()
    my_image = ImageTk.PhotoImage(Image.open(root.filename))
    my_image_label = Label(root, image=my_image)
    my_image_label.pack()

my_button = Button(root, text="Open File", command=open_file)
my_button.pack()
root.mainloop()

однако после того, как я выберу выбранный файл и «отправлю» его, он не появится на созданном мной my_image_label (появляется только пустое пространство размером с изображение). Но когда я использовал содержимое функции open вне функции (без вызов функции) это сработало.

Вы хоть представляете, в чем проблема? и как я могу это исправить?


person mimi quarantine    schedule 12.05.2020    source источник


Ответы (1)


У меня не установлена ​​версия 2.7, поэтому я думаю, что root.filename должно быть просто именем файла.

Что возвращает print root.filename?

Изменить: мое первое предположение неверно. Я модифицировал его для работы в 3.6 и почти ничего не изменил:

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

root = Tk()
root.title('Application')


def open_file():
    filename = filedialog.askopenfilename(initialdir="/", title="Select An Image", filetypes=(("jpeg files", "*.jpg"), ("gif files", "*.gif*"), ("png files", "*.png")))
    image_label = Label(root, text=filename)
    image_label.pack()
    my_image = ImageTk.PhotoImage(Image.open(filename))
    my_image_label = Label(root, image=my_image)
    my_image_label.pack()

my_button = Button(root, text="Open File", command=open_file)
my_button.pack()
root.mainloop()

Возможно ли вам работать в более новой версии Python? Или надо учить 2.7?

Редактировать: Забудьте все, что я сказал. Просто добавьте эту строку: my_image_label.photo = my_image перед тем, как упаковать этикетку.

person PythonAmateur742    schedule 12.05.2020
comment
он печатает путь к файлу @PythonAmateur742 - person mimi quarantine; 12.05.2020
comment
Ах, я неправильно прочитал ваш вопрос. У меня есть решение, я обновлю ответ. - person PythonAmateur742; 12.05.2020