Изображение в окне Tk не отображается, если оно добавлено в обработчик событий - PullRequest
0 голосов
/ 31 декабря 2018
  1. Я пытаюсь привязать фотографию к списку, но фотография не появляется.

  2. Я попытался указать конкретный путь к фотографии здесь.с тем же кодом выше (в choosePhoto), и это сработало.По какой-то причине, когда в коде внутри функции и привязывается функция к listBox, фото не появляется.

Мой код:

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

def openPath(path,listBox):
    try:
       path2=str(path)
       list1= listdir(path2)
       listBox.delete(0,END)
       for i in range(len(list1)):
           listBox.insert(i,list1[i])
    except:
        print("file does not exist")

def choosePhoto(event):
    path=str(textFolder.get())+"\\"+str(listBoxPath.get(ACTIVE))
    image1=ImageTk.PhotoImage(Image.open(path))
    lbl.configure(image=image1)
    print(path)


root = Tk()
root.geometry("450x600")
root.title("project image proccesor")

frame1=Frame(root,width=250,height=100)
frame1.pack(side=LEFT,fill=BOTH)
frame4=Frame(root,width=250,height=100)
frame4.pack(side=RIGHT,fill=BOTH)
lblFolder=Label(frame1,text="Enter folder path:")
lblFolder.grid(row=0,column=0)
textFolder=Entry(frame1,insertwidth=4)
textFolder.grid(rowspan=1,column=0)
listBoxPath=Listbox(frame1)
listBoxPath.grid(row=2)
bChoose=Button(frame1,text="Choose",command=lambda: openPath(textFolder.get(),listBoxPath)).grid(row=1,column=1)
lbl=Label(frame4, text="waiting for photo")
listBoxPath.bind('<<ListboxSelect>>', choosePhoto)
root.mainloop()

1 Ответ

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

Есть три проблемы, которые я вижу здесь в вашем коде.

1-й.Вам необходимо определить image1 как глобальное, потому что это изображение в настоящее время является локальной переменной в функции, и после завершения функции изображения удаляются, если вы не определите его в глобальном пространстве имен.

2nd.Ваша метка, которая используется для отображения изображений, еще не размещена на экране.Вам нужно использовать некоторый менеджер геометрии (вероятно, grid()) в этом случае для отображения изображения.

3-ий.В настоящее время вы используете ACTIVE в вашем списке выбора.Это приведет к тому, что вы выберете то, что было активным до нажатия, вместо того, что вы только что нажали.

Измените это:

list_box_path.get(ACTIVE)

на следующее:

list_box_path.get(list_box_path.curselection())

Я немного очистил ваш код, чтобы он более точно соответствовал стандарту PEP8, и добавил некоторые незначительные изменения и уменьшенный фрагмент кода, которые не были нужны.

import tkinter as tk
from PIL import ImageTk, Image
from os import listdir


def open_path(path):
    try:
        list1 = listdir(path)
        list_box_path.delete(0, "end")
        for i in range(len(list1)):
            list_box_path.insert(i, list1[i])
    except:
        print("file does not exist")


def choose_photo(event):
    global image1
    path = Image.open("{}\\{}".format(text_folder.get(), list_box_path.get(list_box_path.curselection())))
    image1 = ImageTk.PhotoImage(path)
    lbl.configure(image=image1)

root = tk.Tk()
root.geometry("450x600")
root.title("project image processor")

frame1 = tk.Frame(root, width=250, height=100)
frame4 = tk.Frame(root, width=250, height=100)
lbl_folder = tk.Label(frame1, text="Enter folder path:")
text_folder = tk.Entry(frame1, insertwidth=4)
list_box_path = tk.Listbox(frame1)
b_choose = tk.Button(frame1, text="Choose", command=lambda: open_path(text_folder.get()))
lbl = tk.Label(frame4, text="waiting for photo")

frame1.pack(side="left", fill="both")
frame4.pack(side="right", fill="both")
lbl_folder.grid(row=0, column=0)
text_folder.grid(rowspan=1, column=0)
list_box_path.grid(row=2)
b_choose.grid(row=1, column=1)
lbl.grid(row=0, column=0)

list_box_path.bind('<<ListboxSelect>>', choose_photo)
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...