用相同大小的小部件重复替换小部件 - 它是如何完成的?
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)
我目前正在开发基于 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)