【发布时间】: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 坐标。