如何在PanedWindow添加/移除组件时保持根窗口尺寸稳定?
解决PanedWindow操作导致根窗口尺寸变化的问题
问题核心是:根窗口在未手动调整前,会自动根据子组件的请求尺寸调整大小;手动拖动窗口后,系统会固定当前尺寸,后续子组件的尺寸变化不再触发根窗口调整。要在初始状态就实现根窗口尺寸稳定,只需强制根窗口固定初次渲染后的尺寸即可。
具体实现步骤:
- 所有组件创建完成后,调用
root.update()让窗口完成初次渲染,获取真实的初始尺寸 - 通过
root.geometry()将根窗口尺寸固定为当前大小,后续add/forget操作只会改变PanedWindow内部子组件布局,根窗口尺寸保持不变
修改后的示例代码:
import tkinter as tk from tkinter import ttk state = "shown" def hide_show(paned, canvas): global state if state=="shown": paned.forget(canvas) state = "hidden" else: paned.add(canvas, weight=1) state = "shown" root = tk.Tk() paned_window = ttk.PanedWindow(root, orient=tk.HORIZONTAL,) button = ttk.Button (root, text="hide/show", command=lambda: hide_show(paned_window, canvas2)) paned_window.grid(row=0, sticky=(tk.W, tk.E, tk.S, tk.N)) button.grid (row=1, sticky=tk.W) root.rowconfigure (0, weight=1) root.rowconfigure (1, weight=0) root.columnconfigure(0, weight=1) canvas1 = tk.Canvas(paned_window, height=100, width=100, bg="red") paned_window.add(canvas1, weight=1) canvas2 = tk.Canvas(paned_window, height=100, width=100, bg="green") paned_window.add(canvas2, weight=1) # 关键代码:固定根窗口初始尺寸 root.update() root.geometry(f"{root.winfo_width()}x{root.winfo_height()}") root.mainloop()
如果需要保留窗口手动调整的能力,同时让add/forget操作不改变当前尺寸,也可以在操作前后保存并恢复窗口尺寸,不过上述方法是最直接的初始固定方案。
内容的提问来源于stack exchange,提问作者Matthias Schweikart
相关产品推荐
相关产品推荐

