Tkinter:如何确定坐标(x,y)以在画布上放置多个框架?
我正在尝试在tkinter的画布上放置多个框架(frame)。我希望这些框架可以滚动,这篇文章对我帮助很大:
不过,有一件事我搞不明白,就是如何确定在create_window()函数中需要指定的(x,y)坐标。
每个框架里的行数是不固定的,所以每个框架的高度也不同。我想在相邻的框架之间保持相等的间距。为此,我想先确定每个框架的高度,这样我就可以在循环中写出类似这样的代码: y_cord = y_cord + frame_height + spacing
我搜索了很多,但找不到任何方法能在所有控件放置完后给我框架的高度。我使用grid()管理器来管理框架,而winfo_reqheight()方法对所有框架返回的都是1。
我真的很困惑。任何帮助都将不胜感激。
1 个回答
0
我昨天刚做过这个,假设每一行或每一列里的每个项目宽度和高度都和同一行或同一列里的其他项目一样,你可以一行一行或者一列一列地搭建,并记录下坐标。
我做这个的方法是先在(0,0)的位置创建第一个窗口,并把它固定在“西北角”。然后当你调用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)
一旦你添加了所有的小部件,确保更新你的滚动区域,这样才能正确滚动。我通常会做的一件事是,如果边界框返回的区域小于画布显示的大小,那么我就把滚动区域设置为与可见大小匹配,这样可以防止在画布大部分为空的时候还能向上滚动。