Как отобразить несколько изображений с Y прокрутки в Tkinter? - PullRequest
0 голосов
/ 18 марта 2019

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

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

n = 128
path = "/media/mark/B37B-0280/img5/test/mm"
images = []
photos = []
cas = []
root = Tk()
frame = Frame(root)
frame.grid(row=0)
names = [name for name in os.listdir(path)]
images = [Image.open(path + "/" + name).resize((n, n)) for name in names]
photos = [ImageTk.PhotoImage(image) for image in images]
canvas = Canvas(frame, bg="yellow", width=n*len(names), height=n*len(names))
canvas.grid(row=0, sticky="news")
cas = [Canvas(canvas, width=n, height=n) for p in photos]

i = 0
for c, im in zip(cas, photos):
    c.create_image(n/2, n/2, image=im)
    c.grid(row=i)
    i += 1
vsb = Scrollbar(frame, orient="vertical", command=canvas.yview)
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)
root.mainloop()

, как вы видите, есть полоса прокрутки, но неработает, что не так?как это исправить?

Изображения отображаются правильно, но прокрутка не работает

1 Ответ

1 голос
/ 18 марта 2019

Редактировать: Как объяснено в ответе и комментариях к на этот вопрос , виджеты, которые размещаются внутри холста, не являются автоматически элементами холста.Для этого необходимо использовать команду 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...