【问题标题】:Tkinter: How to determine (x,y) coordinates to place multiple frames on canvas?Tkinter:如何确定(x,y)坐标以在画布上放置多个帧?
【发布时间】:2014-09-22 19:27:28
【问题描述】:

我正在尝试在 tkinter 画布上放置多个帧。我希望它们可以滚动,这篇文章真的很有帮助:

Adding a scrollbar to a group of widgets in Tkinter

我无法弄清楚的一件事是如何确定必须在 create_window() 函数中指定的 (x,y) 坐标。

每一帧的行数不定,因此每一帧的高度各不相同。我希望相邻帧之间的间距相等。为此,我想确定每个帧的高度,以便可以在 for 循环中指定类似的内容: y_cord = y_cord + frame_height + 间距

我进行了很多搜索,但是一旦将所有小部件都放置在框架上,我就找不到任何可以给我框架高度的方法。我对帧使用 grid() 管理器,并且 winfo_reqheight() 方法为所有帧返回 1。

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    我昨天才这样做,假设每一行或每一列中的每个项目都与同一行/列中的其他项目具有相同的 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 返回的区域小于画布显示的大小,那么我将滚动区域设置为与可见大小匹配,这样可以防止在画布大部分为空时向上滚动。

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2015-11-25
      • 1970-01-01
      • 2014-03-05
      • 2022-01-21
      相关资源
      最近更新 更多