Tkinter:如何确定(x,y)坐标以在画布上放置多个帧?

时间:2014-07-31 00:05:51

标签: python tkinter

我正在尝试在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。

我真的很困惑。任何帮助将不胜感激。

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>