老板说我不懂tkinter: python tkinter window size position center 窗口大小位置居中上下左右放置

以下内容基于 python3.6、tk8.5、Windows10、1920x1080、无外接屏幕
不同环境可能有不一样的地方,若您有测试数据希望能提醒一下博主噢~

前言:
        事情是这样的,老板让我用 python tkinter 做一个界面,把窗口放置在屏幕正中央,我一看网上百分之一千都是 (屏幕宽度-窗口宽度)/2 完事,结果老板说我这不对…
不是吧啊sir

一、tkinter 窗口的绘制

  1. 创建 tkinter 窗口

    import tkinter as tk
    window = tk.Tk()
    
    window.mainloop()
    
  2. 窗口绘制
    Tk

    如图所示,tkinter 生成窗口时会绘制一个1像素大小的边框,30像素高的标题栏,和 width×height 像素的内页。

二、定义窗口位置

定义窗口位置用到的函数为 window.geometry(‘width x height ±x ±y’)
也可以单独定义大小 .geometry(‘width x height’) 或位置 .geometry(‘±x ±y’);

⚠️ 注意事项:

  1. width x height 中的 x 是小写字母x,不要写成乘法运算符×;
  2. x y是基于窗口四个角(不含边框)上的像素点为坐标原点;
  3. +x表示窗口左边界与屏幕左边界的距离;
  4. -x表示窗口右边界与屏幕右边界的距离;
  5. +y表示窗口标题栏上边界与屏幕上边界的距离;
  6. -y表示窗口下边界与屏幕下边界的距离;
  7. x y本身也可以是负数;
  8. 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;

三、窗口屏幕居中算法

  1. 获取屏幕分辨率

    '''主屏参数'''
    scr_width = window.winfo_screenwidth()	# 屏幕宽度
    scr_height = window.winfo_screenheight()	# 屏幕高度
    
  2. 计算窗口居中时的定位
    根据第二节内容,分析窗口上下左右居中时的位置(假定窗口大小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)
    '''
    
    window_screen

    窗口居中函数:

    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:

  1. window 还有两个参数 winfo_width() 和 winfo_height() 可获取窗口宽高,但注意这个数值是在Windows10屏幕缩放100%情况下的。
  2. 通俗地讲,tkinter以为它在那里,但Tk生成窗口后Windows会根据缩放算法重新绘制窗口,所以以像素为单位时它并不在那里;
  3. 因此如果你想获得窗口真实的像素宽高,还要乘以缩放倍率。

知道了我的做法之后,老板看我的眼神都不一样了!
很厉害嘛小伙子

如果你都看到这里了,那你必然会跟 tkinter 打交道吧。相信我,如果现在不收藏,以后你面对千篇一律的 (屏宽-窗宽)/2 时,想起某位博主好像详细写过不一样的文章,你必找不到我的(¬‿¬)

©2021 CherryChenNan
点赞支持,收藏学习,关注不迷路~

猜你喜欢

转载自blog.csdn.net/qq_27677599/article/details/117888750