我昨天才这样做,假设每一行或每一列中的每个项目都与同一行/列中的其他项目具有相同的 width.height,您可以逐行或逐列构建它并制作一个坐标索引。
我这样做的方法是在 (0,0) 处创建第一个窗口并锚定“nw”,然后当您调用 canvas.bbox(tkinter.ALL) 时,它会为您提供画布上所有小部件的边界框,因此,如果您从构建第一行开始,您将得到一个返回的元组,其中第三项(索引 2)将是第一项结束的位置。然后,您可以将下一个窗口放置在 (result, 0) 并在画布上构建。
然后您可以在画布上重复此操作以完成其余行。
我使用的代码摘录如下,这很简单,在可滚动画布上制作条目小部件表。
xposlist = []
for row in self.data:
size = self.canvas.bbox(tk.ALL)
try:
y = size[3]+1
except TypeError:
y = 0
for index in range(0, len(row)):
if len(xposlist) < len(row):
size = self.canvas.bbox(tk.ALL)
try:
x = size[2]+1
except TypeError:
x = 0
xposlist.append(x)
else:
x = xposlist[index]
entry = tk.Entry(self.canvas, disabledbackground="white", disabledforeground="black")
data = row[index]
if data != "": entry.insert(0, data)
entry.configure(state="disabled")
self.canvas.create_window((x,y), anchor="nw", window= entry)
添加所有小部件后,请确保更新滚动区域以使其正确滚动。我通常尝试做的一个事情是,如果 bbox 返回的区域小于画布显示的大小,那么我将滚动区域设置为与可见大小匹配,这样可以防止在画布大部分为空时向上滚动。