我正在尝试在tkinter画布上放置多个帧。我希望它们可以滚动,这个帖子确实有帮助:
Adding a scrollbar to a group of widgets in Tkinter
我无法弄清楚的一件事是如何确定必须在create_window()函数中指定的(x,y)坐标。
每个帧中都有可变行数,因此每个帧的高度会有所不同。我希望相邻帧之间的间距相等。为此,我想确定每个帧的高度,以便我可以在for循环中指定类似的东西: y_cord = y_cord + frame_height + spacing
我已经搜索了很多,但是一旦所有小部件都放在框架上,就无法找到能给我框架高度的任何方法。我使用grid()管理器作为框架,winfo_reqheight()方法为所有框架返回1。
我真的很困惑。任何帮助将不胜感激。
答案 0 :(得分:-1)
我昨天刚刚这样做,假设每行或每列中的每个项目都是相同的width.height,就像同一行/列中的其他项目一样,可以逐行或逐列构建它们。指数。
我这样做的方法是在(0,0)创建第一个窗口并锚定“nw”然后当你调用canvas.bbox(tkinter.ALL)时,它会为你提供画布上所有小部件的边界框,因此,如果您从构建第一行开始,您将获得一个返回的元组,其中第三个项目(索引2)将是第一个项目结束的位置。然后,您可以将下一个窗口放在(结果,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返回的区域小于显示画布的大小,那么我将滚动区域设置为与可见大小相匹配,这样就无法在画布大部分为空时向上滚动。 / p>