我是小鱼,今天是2022年2月10日。
之前用python在做扫雷游戏时,发现总是拿不准部件大小与字体之间的关系,为此,当时还特地写了一篇BLOG《Tkinter中的标签(Lable)与按钮(Button)的大小问题》,扫雷写完后我有时间慢慢回头再来看这个问题,发现当时的理解有很多是错误的。于是那篇文章我删除了,我准备重新再整理一下。
无论是标签还是按钮,在Tk中都被称为部件。以标签为例,在Tkinter.Lable的类中有width和height这两个属性。文档说明是说这两个值是用来设置标签的宽度与高度的,单位为像素。如果标签中放置的是图片的话,的确是这个样子,但如果标签中是文本的话,这两个值就与文本本身有关了。是文本的基本像素的倍数。文本的基本像素是与字体有关的,与部件应当无关。而字体的大小,粗细,倾斜都会影响字体的基本像素的大小。这才是导致我当时总是拿不准标签与按钮的大小的主要原因。
这里要在引入Tkinter中对字体的封装的类,Tkinter.Font——参见说明文档
TK将字体封装在类当中,为了方便我们的使用。因此与字体有关的参数都可以从这个类的两个主要方法中获取出来,一个是measure, 另一个是metrics
measure方法是:返回以当前字体格式化时文本将在指定显示上占用的空间量
用法是 ziti.measure('8') 前面的字体是从封装的字体库中实例化的类,后面的8可以是任意内容,即为你想知道的这些内容在显示器上需要占多少个像素的宽度(见下面图片)
metrics有4个属性值,说明文档中有说明,这里我解释一下前面3个 'ascent', 'descent', 'linespace'
说明文档中:ascent -- 基线和最高点之间的距离; descent -- 基线和最低点之间的距离; linespace -- 所需最小垂直间距(在两个该字体的字符间,使得这两个字符在垂直方向上不重叠)
其实linespace = ascent + descent, 那么基线是什么,见下面的图片