resizable(false, false) 有时无效主因是调用时机错误:须在 geometry() 之后、mainloop() 之前执行,且不能被后续操作覆盖;漏设 geometry 或环境干扰(如wayland、ide控制台)也会导致失效。

为什么 resizable(False, False) 有时没效果
常见现象是调用后窗口仍能拖拽边框缩放,尤其在 Windows 上更明显。根本原因不是函数失效,而是调用时机不对:必须在 geometry() 之后、mainloop() 之前执行,且不能被后续的 geometry() 或窗口管理器行为覆盖。
- 如果先调用
resizable()再设置geometry(),部分系统会重置可调整状态 - 某些 IDE(如 PyCharm 的 Python Console)或远程桌面环境会忽略该设置,需在原生终端运行验证
- Linux 下若使用 Wayland,部分桌面环境(如 GNOME)可能强制启用窗口控制,
resizable()仅影响 Tk 自身逻辑,不干预 WM 行为
正确写法:顺序和位置不能错
最简可靠写法就是三步固定顺序:创建根窗口 → 设置尺寸 → 锁定大小 → 启动循环。中间不要穿插其他窗口操作(比如 update_idletasks() 通常没必要,反而可能干扰)。
root = Tk()-
root.geometry("400x300")—— 必须有具体值,不能留空或只设最小尺寸 -
root.resizable(False, False)—— 必须紧接在geometry()后 root.mainloop()
示例中若漏掉 geometry(),Tk 会按内容自动撑开窗口,此时 resizable(False, False) 虽生效,但用户仍可通过最大化按钮改变尺寸(因为未限制最大尺寸)。
想彻底禁用最大化按钮?光靠 resizable 不够
resizable(False, False) 只禁用拖拽缩放,不隐藏最大化按钮,点击后窗口仍可能全屏(尤其 Windows)。要真正移除该按钮,得配合 overrideredirect 或 attributes,但代价是失去标题栏和关闭按钮。
- Windows/macOS 推荐:
root.attributes("-toolwindow", True)—— 隐藏最大化按钮,保留最小化和关闭 - 全平台通用但高风险:
root.overrideredirect(True)—— 彻底去掉边框,需自己实现关闭逻辑 - 不推荐用
wm_withdraw()+wm_deiconify()组合“骗过”窗口管理器,兼容性差且易触发闪烁
替代方案:用 minsize 和 maxsize 更灵活
如果目标只是“视觉上不可调”,而非绝对禁止,minsize() 和 maxsize() 是更稳妥的选择——它们明确告诉 Tk 窗口尺寸边界,且不受多数桌面环境干扰。
-
root.minsize(400, 300)和root.maxsize(400, 300)效果等同于resizable(False, False),但兼容性更好 - 当窗口含动态控件(如文本框随内容增长),硬锁尺寸会导致布局溢出;此时应优先考虑
grid_propagate(False)或容器约束,而不是强行禁调 - 注意:若同时设了
geometry()和maxsize(),且geometry值超过maxsize,Tk 会以maxsize为准裁剪,可能截断内容
真正难处理的是嵌套在 Toplevel 或多显示器场景下的 DPI 缩放问题:resizable 不感知缩放比,但 geometry 传入的是物理像素值,高 DPI 下容易误判尺寸边界。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











