Изображения не отображаются в представлении прокрутки в связанном окне верхнего уровня в python tkinter - PullRequest
0 голосов
/ 20 мая 2019

Я пытался создать вид окна верхнего уровня, который собирает и показывает все изображения, присутствующие в папке, в столбцах по 10. Если изображения были больше, чем выделенный размер окна, я хотел бы, чтобы это было возможнопрокрутите изображения.Я следовал ответу, данному Scrolllable Toplevel Window (tkinter) , чтобы правильно добавить изображение на холст и сделать возможным его прокрутку.Но в моем случае все всплывающее окно просто оказывается пустым.Вот код

import tkinter as tk
from tkinter import *
import glob
import os
from PIL import Image, ImageTk

def pop_up_window():
   win = Toplevel()

   vbar = tk.Scrollbar(win, orient = VERTICAL)
   vbar.grid(row = 0, column = 1, sticky = "ns")

   container = tk.Canvas(win, height=300, width=720, scrollregion=(0, 0, 300, 720))
   container.grid(row = 0, column = 0, sticky = "nsew")

   vbar.config(command=container.yview)
   container.config(yscrollcommand=vbar.set)

   path = "D:\\image_collection"
   COLUMNS = 10
   image_count = 0

   for infile in glob.glob(os.path.join(path, '*.jpg')):
      image_count += 1
      r, c = divmod(image_count-1, COLUMNS)
      im = Image.open(infile)
      resized = im.resize((100, 100), Image.ANTIALIAS)
      img_part = ImageTk.PhotoImage(Image.open(infile).resize((100, 100), Image.ANTIALIAS))
      image_in_canvas = container.create_image(r, c, image = img_part)

   win.rowconfigure(0, weight=1)
   win.columnconfigure(0, weight=1)

root = Tk()
button = Button(root, text='Call Pop-up window', command = pop_up_window)
button.place(x = 0, y = 0)
root.mainloop()

Какие изменения я должен сделать?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Вам необходимо сохранить ссылку на ваши изображения, иначе Python соберет мусор. Простое изменение может сделать это:

placeholder = []

def pop_up_window():
    ...

    for infile in glob.glob(os.path.join(path, '*.jpg')):
       image_count += 1
       r, c = divmod(image_count-1, COLUMNS)
       im = Image.open(infile)
       img_part = ImageTk.PhotoImage(Image.open(infile).resize((100, 100), Image.ANTIALIAS))
       placeholder.append(img_part)
       image_in_canvas = container.create_image(r, c, image = img_part)

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

0 голосов
/ 20 мая 2019

Ваш код работает, но с ним мало проблем.Я исправил все или, может быть, большинство из них, на случай, если я забыл это заметить.

  • При создании изображения в функции всегда создавайте ссылку на них, так как здесь у вас много изображенийтак что вы можете создать список для вашего container.

  • Чтобы постоянно обновлять scrollregion в зависимости от количества изображений, привязанных "" к container с функцией обратного вызова lambda e: scrollregion=container.bbox('all').

Вот изменения, которые я внес в вашу pop_up_window функцию.

...

path = "D:\\image_collection"
COLUMNS = 7
container.img_list = []
column = 0
row = 0

for infile in glob.glob(os.path.join(path, '*.jpg')):
    if column >= COLUMNS: 
        column = 0
        row += 1
    im = Image.open(infile).resize((100, 100), Image.ANTIALIAS)
    img = ImageTk.PhotoImage(im)
    container.img_list.append(img)
    container.create_image(column*100+10, row*100+10, image = img, anchor='nw')
    column += 1

container.bind('<Configure>',lambda e:container.configure(scrollregion=container.bbox('all')))

...
...