以下内容基于 python3.6、tk8.5、Windows10、1920x1080、无外接屏幕
不同环境可能有不一样的地方,若您有测试数据希望能提醒一下博主噢~
前言:
事情是这样的,老板让我用 python tkinter 做一个界面,把窗口放置在屏幕正中央,我一看网上百分之一千都是 (屏幕宽度-窗口宽度)/2
完事,结果老板说我这不对…
一、tkinter 窗口的绘制
-
创建 tkinter 窗口
import tkinter as tk window = tk.Tk() window.mainloop()
-
窗口绘制
如图所示,tkinter 生成窗口时会绘制一个1像素大小的边框,30像素高的标题栏,和 width×height 像素的内页。
二、定义窗口位置
定义窗口位置用到的函数为 window.geometry(‘width x height ±x ±y’) ;
也可以单独定义大小 .geometry(‘width x height’) 或位置 .geometry(‘±x ±y’);
⚠️ 注意事项:
width x height
中的x
是小写字母x,不要写成乘法运算符×;x
y
是基于窗口四个角(不含边框)上的像素点为坐标原点;+x
表示窗口左边界与屏幕左边界的距离;-x
表示窗口右边界与屏幕右边界的距离;+y
表示窗口标题栏上边界与屏幕上边界的距离;-y
表示窗口下边界与屏幕下边界的距离;x
y
本身也可以是负数;x
y
的值为0
不代表与屏幕边角重合,而是留有间隔以显示边框和阴影,具体见以下图示:




所以,如果你想将窗口紧靠屏幕左上角,你可以这样写:
window.geometry('500x300+-7+0')
紧靠右上角:
window.geometry('500x300--7+0')
紧靠左下角:
window.geometry('500x300+-7--7')
紧靠右下角:
window.geometry('500x300--7--7')
⚠️注意事项:
如果你的电脑设置了Windows显示缩放,假定设为125%,那么这个上述 7
要改为8×1.25-1=9;
三、窗口屏幕居中算法
-
获取屏幕分辨率
'''主屏参数''' scr_width = window.winfo_screenwidth() # 屏幕宽度 scr_height = window.winfo_screenheight() # 屏幕高度
-
计算窗口居中时的定位
根据第二节内容,分析窗口上下左右居中时的位置(假定窗口大小500x300):# 窗口和屏幕参数 width = 500 height = 300 scr_width = 1920 scr_height = 1080 # 计算左上角位置 x = (scr_width-width-16)//2 y = (scr_height-height-32)//2 # 放置窗口 window.geometry(f'{width}x{height}+{x}+{y}') '''此算法得到的 x 可用于 +x 和 -x 得到的 y 用于 +y,若用于 -y 需要将 y 再减 7 此外,若HDPI屏幕缩放率为 scale_rate != 1.00,x y 也无需进行修正; 只是 y 用于 -y 时需要修正 y = int(y-8*scale_rate+1) '''
窗口居中函数:
def set_window_center(window,width=None,height=None): '''窗口屏幕居中算法 坐标原点: 窗口四个角(边框不算) 窗口绘制: 左下右各与屏幕间距8像素,其中1像素绘制边框;上与屏幕间距1像素绘制边框;间距用于边框与阴影 屏幕缩放: 窗口(大小x缩放倍率),左下右与屏幕间距(8x缩放倍率)像素,其中1像素绘制边框,即边框不参与缩放 算法精度: 误差1像素(窗口大小为奇数或屏幕有缩放时) 屏幕缩放: 自适应缩放率 ''' if width==None:width=200 if height==None:height=200 scr_width = window.winfo_screenwidth() scr_height = window.winfo_screenheight() size_position = f'{width}x{height}+{(scr_width-width-16)//2}+{(scr_height-height-32)//2}' window.geometry(size_position)
PS:
- window 还有两个参数 winfo_width() 和 winfo_height() 可获取窗口宽高,但注意这个数值是在Windows10屏幕缩放100%情况下的。
- 通俗地讲,tkinter以为它在那里,但Tk生成窗口后Windows会根据缩放算法重新绘制窗口,所以以像素为单位时它并不在那里;
- 因此如果你想获得窗口真实的像素宽高,还要乘以缩放倍率。
知道了我的做法之后,老板看我的眼神都不一样了!
如果你都看到这里了,那你必然会跟 tkinter 打交道吧。相信我,如果现在不收藏,以后你面对千篇一律的 (屏宽-窗宽)/2 时,想起某位博主好像详细写过不一样的文章,你必找不到我的(¬‿¬)
©2021 CherryChenNan
点赞支持,收藏学习,关注不迷路~