我对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()
您看到有一个滚动条但不起作用,这是怎么回事?该如何解决?
图像显示正确,但滚动不起作用
答案 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()