Редактировать: Как объяснено в ответе и комментариях к на этот вопрос , виджеты, которые размещаются внутри холста, не являются автоматически элементами холста.Для этого необходимо использовать команду canvas.create_window
, как объяснено здесь .Я отредактирую свой код в конце этого ответа, чтобы он работал должным образом.
При добавлении Scrollbar
к Canvas
в tkinter может потребоваться передать дополнительный аргументназывается scrollregion
- холст должен «знать», к какой части своей системы координат вы хотите прокрутить.Поэтому добавление
canvas.config(scrollregion=canvas.bbox(ALL))
должно заставить его работать как задумано.canvas.bbox
указывает область ( ограничивающий прямоугольник ) холста, ALL
просто указывает ограничивающий прямоугольник для всех элементов.
Кроме того, несколько общих советов: вы можете удалить часть
images = []
photos = []
cas = []
в своем коде, потому что вы все равно определите эти списки позже.Кроме того, даже создание этих списков не является необходимым (по крайней мере, с учетом того, как ваш код структурирован прямо сейчас, если вам нужно что-то сделать с ними позже, это, конечно, может быть полезно), вы можете поместить все это в один цикл (кодне проверено!) отредактировано :
from Tkinter import *
import os
from PIL import ImageTk, Image
n = 128
path = "/media/mark/B37B-0280/img5/test/mm"
root = Tk()
frame = Frame(root, width=n*number, height=n*number).grid(row=0)
number = len(os.listdir(path))
canvas = Canvas(frame, bg="yellow", width=n*number, height=n*number)
i = 0
for name in os.listdir(path):
image = Image.open(path + "/" + name).resize((n, n))
photo = ImageTk.PhotoImage(image)
c = Canvas(canvas, width=n, height=n)
c.create_image(n/2, n/2, image=photo)
canvas.create_window(0, n*i, window=c)
i += 1
vsb = Scrollbar(frame, orient=VERTICAL)
vsb.pack(side=RIGHT, fill=Y)
vsb.config(command=canvas.yview)
canvas.config(width=n * number, height=n * number)
canvas.config(yscrollcommand=vsb.set, scrollregion=canvas.bbox(ALL))
canvas.pack(side=LEFT,expand=True,fill=BOTH)
root.mainloop()