用相同大小的小部件重复替换小部件 - 它是如何完成的?

Repeated replacement of a widget with a widget of equal size - how its done?

我目前正在开发基于 tkinter 的 python gui,在我的程序中,您可以按下一个按钮,然后第一个小部件变得不可见,另一个小部件显示在相同的位置第一个。之后你可以切换回来,第二个小部件消失,第一个小部件将在相同的位置可见,依此类推......

我的目标是,如果您切换 wdigets,这两个小部件将获得相同的大小,并且用户将看不到任何 bigger/smaller 小部件,但我无法说出如何实现 -你能帮帮我吗?

我的 tkinter window:

self.window = tkinter.Tk()
self.window.resizable(True, True)
self.window.grid_rowconfigure(2, weight=1)
self.window.grid_columnconfigure(0, weight=2)
self.window.grid_columnconfigure(1, weight=1)

我的两个小部件的框架:

contentFrame = tkinter.Frame(master=self.window, bg="#FFF", highlightthickness=0, borderwidth=0)
contentFrame.grid_rowconfigure(0, weight=1)
contentFrame.grid_columnconfigure(0, weight=1)
contentFrame.grid(column=0, row=2, padx=5, pady=5, sticky="nsew")

我的第一个小部件(红色的):

canvas = tkinter.Canvas(master=contentFrame, bg="#F00", highlightthickness=0, borderwidth=0)
        canvas.pack(fill="both", expand=True)

我的第二个小部件(蓝色的)

xmlEditor = tkinter.Text(master=contentFrame, bg="#00F", highlightthickness=0, borderwidth=0)

从红色变为蓝色时发生了什么:

self.window.children["!frame2"].children["!canvas"].pack_forget()
self.window.children["!frame2"].children["!text"].pack(fill="both", expand=True)

当从蓝色变为红色时发生了什么:

self.window.children["!frame2"].children["!text"].pack_forget()
self.window.children["!frame2"].children["!canvas"].pack(fill="both", expand=True)

观看视频 here 以查看实际问题:)

我会做的是使用一个控制大小的中间框架。然后,您可以将红色或蓝色框架打包到此框架内。

首先创建一个具有所需大小的子框架。假设您希望该区域为 500x500:

subframe = tk.Frame(contentFrame, width=500, height=500)
subframe.pack(fill="both", expand=True)

接下来,关闭几何传播,这样框架就不会扩大或缩小以适合其子项:

subframe.pack_propagate(False)

最后,将您的红色和蓝色框架放入此子框架内:

canvas = tkinter.Canvas(master=subframe, bg="#F00", highlightthickness=0, borderwidth=0)
xmlEditor = tkinter.Text(master=subframe, bg="#00F", highlightthickness=0, borderwidth=0)