썸네일의 내용에 따라 여러 개의 썸네일을 표시하고 다른 작업을 할 수 있기를 바랍니다. 이를 위해 Tkinter의 위젯 그룹에 스크롤바 추가 의 예제를 가져 와서 첫 번째 열에 레이블을, 포함 된 그리드의 두 번째 열에 이미지를 넣었습니다. 샘플 썸네일로이 이미지를 다운로드 하고 이름을 160x120.jpg
.
import Tkinter as tk
from PIL import Image, ImageTk
class Example(tk.Frame):
def __init__(self, root):
tk.Frame.__init__(self, root)
self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame, anchor="nw",
tags="self.frame")
self.frame.bind("<Configure>", self.OnFrameConfigure)
self.photos = []
self.imgs = []
self.images = []
self.lbls = []
self.populate()
def populate(self):
'''Put in some fake data'''
# n_thumbs = 100 : As expected, one label and one image per row.
# n_thumbs = 300 : Images are only displayed up to the 278th.
# n_thumbs = 600 : Just 63 images are displayed. Two labels per row.
n_thumbs = 100
for i in range(n_thumbs):
lbl = tk.Label(self.frame, text="img " + str(i), width=10)
lbl.grid(row=i, column=0)
photo = Image.open("160x120.jpg")
img = ImageTk.PhotoImage(photo)
image = tk.Label(self.frame, image=img)
image.grid(row=i, column=1)
self.lbls.append(lbl)
self.photos.append(photo)
self.images.append(image)
self.imgs.append(img)
def OnFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
Example(root).pack(side="top", fill="both", expand=True)
root.mainloop()
이제를 설정 n_thumbs = 100
하면 모든 것이 예상대로 작동합니다. 즉, 행당 하나의 레이블과 하나의 이미지가 있습니다.
를 설정 n_thumbs = 300
하면 목록이 갑자기 278 번째 이미지로 끝납니다.
을 설정 n_thumbs = 600
하면 63 개의 이미지 만 표시되지만 마지막 이미지 이후로 아래로 스크롤 할 수 있습니다. 또한 갑자기 각 행에 두 개의 레이블이 있습니다.
이러한 효과를 어떻게 설명 할 수 있습니까? Tkinter를 사용하여 그리드에 300 개 이상의 이미지를 표시하려면 어떻게해야합니까?
사실은 모르겠지만 제 생각에는 당신이 tk 캔버스의 한계를 초과하고 있다는 것입니다. 120 픽셀 높이의 이미지를 사용하면 포함하는 프레임이 높이 32k (32767) 픽셀을 초과하기 전에 272 개의 이미지를 세로로 표시 할 수 있습니다. 캔버스가 32767x32767보다 클 수 없다는 엄격한 제한이있을 수 있습니다. 또는 좌표가 -32767에서 +32767로 제한 될 수 있습니다. 썸네일 중 일부가 정확히 120 픽셀이 아닌 경우 278 개의 제한을 설명 할 수 있습니다. OSX 시스템에서 약간 다른 제한을 확인했습니다.
다시 말하지만 사실은 모르겠지만 가능성이있는 것 같습니다.
이것이 어려운 제한이라면 약간의 작업으로 한 번에 한 화면 만 표시 할 수 있으며,보기로 스크롤 될 때만 새 이미지를로드 할 수 있습니다 (그리고보기에서 스크롤 된 이미지를 파괴 할 수 있습니다). 그리고 포함 된 프레임을 사용하는 대신 캔버스에 직접 이미지를 그립니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다