如何在tkinter中使用y滚动条显示多个图像?

时间:2019-03-18 11:55:45

标签: python tkinter

我对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 个答案:

答案 0 :(得分:1)

编辑:如对this question的答复和评论中所述,放置在画布中的窗口小部件不会自动成为画布项目。为此,需要使用canvas.create_window命令,如here所述。我将在此答案的末尾编辑我的代码,以使其按预期工作。


在tkinter中将Scrollbar添加到Canvas时,可能需要传递一个名为scrollregion的附加参数-Canvas必须“知道”坐标系统的哪一部分您想滚动到。因此添加

canvas.config(scrollregion=canvas.bbox(ALL))

应使其按预期工作。 canvas.bbox指定画布的区域(bounding box),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()