tkinter中需调用root.resizable(false, false)禁用窗口缩放,因geometry()仅设初始尺寸,不阻止用户拖拽调整;该方法两个参数必须均为布尔值,缺一不可。

Python Tkinter中调用resizable()禁用窗口缩放
Tkinter窗口默认允许用户拖拽边框调整大小,想固定尺寸必须显式关闭。核心就是resizable()方法——它接受两个布尔参数:width和height,分别控制横向和纵向是否可拉伸。
常见错误是只传一个参数(比如resizable(False)),这会报TypeError: resizable() takes exactly 2 arguments;也有人误写成resizable(0, 0),虽然数值上等价,但官方文档明确要求用True/False,避免类型混淆。
正确写法:
import tkinter as tk
root = tk.Tk()
root.title("固定尺寸窗口")
root.geometry("400x300")
root.resizable(False, False) # 关键:两个False
root.mainloop()
PyQt5/6里用setFixedSize()比setResizeable()更直接
PyQt系列不提供类似Tkinter的resizable(),而是用setFixedSize()一步锁定宽高。这个方法会同时禁用拉伸和最大化按钮,比单独调用setMaximumSize()和setMinimumSize()更简洁、不易出错。
注意点:
-
setFixedSize()必须在show()之前调用,否则无效 - 如果窗口已有布局(如
QVBoxLayout),固定尺寸后控件可能被裁剪,需确保子控件尺寸适配 - 不能和
setMinimumSize()或setMaximumSize()混用,后者优先级低,会被覆盖
示例:
from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication([])
window = QWidget()
window.setWindowTitle("固定窗口")
window.resize(400, 300)
window.setFixedSize(400, 300) # 关键:直接锁定
window.show()
app.exec_()
为什么geometry()设完还要resizable(False, False)?
很多人以为geometry("400x300")或resize(400, 300)就够了,其实这只是初始尺寸——用户仍可手动拖拽改变。窗口可拉伸性是独立于尺寸的属性,必须单独关闭。
典型误操作场景:
- 只设
geometry,运行后发现右下角能拖动 → 忘了resizable() - 用
wm_attributes("-resizable", False)(Tcl/Tk底层命令),但该方法在部分系统(如macOS)不生效,且非标准接口 - 在
after()回调里调用resizable(),导致首次渲染时仍可拉伸一小段时间
跨平台兼容性要注意的细节
Windows和Linux下resizable(False, False)行为一致,但macOS有个隐藏问题:即使禁用拉伸,窗口标题栏右侧的绿色全屏按钮仍显示,点击后会进入“伪全屏”(实际只是拉伸到屏幕尺寸)。这不是bug,而是macOS原生行为。
解决方案有限,最稳妥的是:
- 接受该现象(用户无法真正缩放,只是按钮存在)
- 用
root.wm_attributes("-zoomed", False)尝试隐藏按钮(仅macOS有效,但部分版本不支持) - 彻底弃用原生标题栏,自绘窗口(复杂度陡增,一般没必要)
真正容易被忽略的是:固定尺寸后,如果程序后续调用update_idletasks()或动态添加控件,可能触发窗口重排并意外改变尺寸——务必在所有UI构建完成后,再执行resizable()或setFixedSize()。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











