如何在Tkinter中将框架居中于另一个框架?

12 投票
2 回答
45733 浏览
提问于 2025-04-16 07:25

我有一个框架,我用 grid_propagate() 方法固定了它的大小。现在我想在这个框架中把另一个框架居中,应该怎么做呢?

2 个回答

6

如果你想把一个小部件(比如一个框)放在另一个框的正中间,最简单的方法就是用 .grid()。如果你用 .pack(),那么小部件就会被固定在某一边,因为 pack() 有一个 side 的选项。

如果你用 .place(),那么你就得强行设置外框的大小(通常你不需要这样做,但既然你已经做了,那就没问题),因为用 place 放置的小部件在外框自动调整大小时是无法被检测到的,这和用 pack()grid() 放置的小部件不一样。我也不太清楚为什么会这样,但就是这样。

所以,总的来说,把小部件放在框的正中间的最好方法就是用 grid。默认情况下,sticky 选项是 CENTER。如果你想在调整外框大小时小部件仍然保持居中,你需要让外框的单元格可以扩展。你可以通过 .grid_rowconfigure() 等命令来实现。所以,一个例子可能是:

        widget = Widget(frame, ...)
        widget.grid(row=0, column=0, sticky="")
        frame.grid_rowconfigure(0, weight=1)
        frame.grid_columnconfigure(0, weight=1)
19

把它放大到填满所有方向。根据需要添加一些内边距。

或者,可以使用放置功能,这样你就可以使用相对或绝对定位。你可以设置相对的x/y为0.5/0.5,并且锚点设置为“c”(中心)。

import Tkinter as tk

root=tk.Tk()
f1 = tk.Frame(width=200, height=200, background="red")
f2 = tk.Frame(width=100, height=100, background="blue")

f1.pack(fill="both", expand=True, padx=20, pady=20)
f2.place(in_=f1, anchor="c", relx=.5, rely=.5)

root.mainloop()

撰写回答