【问题标题】:Python Tkinter: Placing items with .place in framePython Tkinter:在框架中放置带有.place的项目
【发布时间】:2021-06-14 20:52:09
【问题描述】:

关于框架上各种项目的 .place 函数,我无法理解一件事。

当我使用网格或包装时,框架会自行调整大小以适应放置的项目,这是已知的。 但是,当我使用 .place(x, y) 将我的项目放置在框架内时,它不会自行调整大小。

有解决办法吗?像 update_frame_size(frame.bbox('all')) 之类的?

这是我的代码:

class Example(tk.Frame):
    def __init__(self, parent):

        tk.Frame.__init__(self, parent)
        self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4,4), window=self.frame, anchor="nw",
                                  tags="self.frame")

        self.frame.bind("<Configure>", self.onFrameConfigure)

        self.populate()

    def populate(self):
        # Here is the problem:
        for row in range(100):
            tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1",
                     relief="solid").place(x=0, y=row*10)

    def onFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    root=tk.Tk()
    example = Example(root)
    example.pack(side="top", fill="both", expand=True)
    root.mainloop()

【问题讨论】:

  • 诀窍是不要使用 .place ,除非你绝对必须这样做。如果您使用位置调整应用程序的大小,那么您每次都必须重新配置它们的大小/位置。 Pack/Grid 将为您做到这一点。鉴于您只是将标签垂直放置 10 像素,为什么不使用网格并更改行号而不是 y 坐标。

标签: python tkinter frame


【解决方案1】:

但是,当我使用 .place(x, y) 将我的项目放置在框架内时,它不会自行调整大小。

这是正确的,这是 place 的记录行为,这也是为什么 packgrid 通常比使用 place 更好选择的原因之一。

有解决办法吗?像 update_frame_size(frame.bbox('all')) 之类的?

没有。如果您使用place,则由您自己计算所有坐标和大小。

在您的具体示例中,您正在垂直堆叠标签。为此,pack 将是一个更简单的解决方案。

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2018-05-11
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多