gpt4 book ai didi

python - 嵌入超过 280 个元素的 Canvas 中的 Tkinter 网格的意外行为

转载 作者:行者123 更新时间:2023-12-01 05:32:06 25 4
gpt4 key购买 nike

我想显示很多缩略图,并能够根据缩略图的内容对它们执行不同的操作。为此,我采用了 Adding a scrollbar to a group of widgets in Tkinter 中的示例。并将标签放在嵌入网格的第一列中,将图像放在第二列中。作为示例缩略图,您可以下载此 image并将其重命名为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 Canvas 的限制。对于 120 像素高的图像,在包含帧的高度超过 32k (32767) 像素之前,您可以垂直显示 272 个图像。也许有一个硬性限制,即 Canvas 不能大于 32767x32767。或者坐标可能被限制在 -32767 到 +32767 之间。如果您的某些缩略图的高度不完全是 120 像素,这可能可以解释您所看到的 278 像素的限制。我在我的 OSX 系统上看到的限制略有不同。

再说一次,我不知道事实是否如此,但似乎有可能。

如果这是一个硬性限制,只需做一些工作,您一次只能显示一屏,并且仅当新图像滚动到 View 中时才加载新图像(并且您可以销毁已滚动到 View 之外的图像)。并且,不使用嵌入框架,而是直接在 Canvas 上绘制图像。

关于python - 嵌入超过 280 个元素的 Canvas 中的 Tkinter 网格的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com