pyside2系列:DPI自适应窗口程序-根据页面缩放和分辨率自动改变

实际应用过程中会涉及到2方面的内容

  1. 元素坐标偏移量 自动调整

  2. 界面自适应

python代码

# 待更新

界面自适应

待补充

扩展阅读

参考文章:https://blog.csdn.net/huadingjin/article/details/81074045

控制按键的实际应用中,比如我想复制出 (ctrl + A )有些客户端的对话记录 ,起初使用 窗口绑定,再模拟按键

    def keys_control_handle(self, handle, *args):
        """
        定义组合按键
        :param handle:
        :param args:  ctrl: win32con.VK_CONTROL  17, enter:win32con.VK_RETURN  13
        :return:
        """
        # print(f'按键:{args}, 句柄:{handle}')
        for arg in args:
            win32api.SendMessage(handle, win32con.WM_KEYDOWN, arg, 0)
        time.sleep(0.1)
        for arg in args[::-1]:
            win32api.SendMessage(handle, win32con.WM_KEYUP, arg, 0)  # 释放按键,arg[::-1]元组倒序

发现不起作用,只能用以下全局监听键盘事件方法

    def shortcutKeys(self,*args):
        """
        快捷键(可进行键盘组合操作)
        :param handle:
        :param args:  ctrl: win32con.VK_CONTROL, enter:win32con.VK_RETURN
        :return:
        """
        """传入键的ASCII码按下和释放,Ctrl键的ASCII码为17 ,A[65],C[67],V[86],enter[13]"""
        for arg in args:
            win32api.keybd_event(arg, 0, 0, 0)
        time.sleep(0.1)
        for arg in args[::-1]:
            win32api.keybd_event(arg, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键,arg[::-1]元组倒序

奇怪的是 敲回车发送的时候, 绑定窗口,模拟按键 enter 确可以发送成功(并且可以支持后台操作)

http://biji.51automate.cn/blogs/img/%E5%8A%A8%E7%94%BB.gif

为什么分辨率调小后不能全屏 且 软件变大了?

比如你是1920*1080的分辨率 ,宽高比为 1920/1080 = 1.77

你主动帮调成1680*1050 的分辨率 宽高比为 1920/1080 = 1.6

你选择笔记本显示模式是“保持原比例”就会有黑边。你把它调成“强制维持纵横比”就 ok了。

原理:分辨率调低,横向和纵向的像素点数量 随之改变,比如从1920降低为1680个像素点,显示器的大小是固定的, 像素点总数少了,像素点的大小就会变大

图片软件界面就是由一个个像素点构成,原本这个软件界面(图片)需要100个像素点,调低分辨率之后还是需要100个像素点,只不过现在的像素点大小变大了 ,视觉上软件界面(图片)放大了(给人的感觉 画质相比之前就会降低,变得模糊)。

其实 像素点的数量 是不变的,那么软件内两点的相对坐标(像素点数量)也是不变的。

1920*1080
100% 缩放 , 窗口尺寸宽高(920,440)

1680*1050      观看效果 图像变大 (但是宽高像素点总数不变,同样的道理:相对坐标也不变)
100% 缩放 , 窗口尺寸宽高(920,440)

相反: 你1920*1080的显示器不要了。

突然换了一个2K的显示屏(2560*1440),瞬间感觉电脑桌面变的好小, 为了能清楚的看到图片文字,系统一般会自动帮您调整屏幕的缩放比例 一般是150%(用系统推荐的即可)

image-20230413175527571

从100%调整到150%后,原本看起来很小的桌面图标、文字等 又放大回来了,和1920*1080的显示器差不多。清晰度也更高了

关于DPI

上面 调大缩放比例(就是调高了系统的DPI) 给人 放大的效果,其实是桌面图标、文字、软件界面 根据 调整后的windows系统DPI 自动进行了UI缩放。

有些软件并没有做自适应,并不能很好的兼容屏幕的高DPI,就会出现 界面模糊、控件错位、文本显示不全等情况,这里不讨论。

我用某些软件 截图时出现屏幕自动放大(大漠绑定窗口时出现放大、错位)解决办法<点击查看

DPI定义

全称是dots per inch (DPI), 也就是每英寸的点数,在显示器上就是 **每英寸的像素个数**

思考一个问题:为什么DPI(每英寸的像素个数)设置高了之后, 我们看到的字体会变大?

系统对同一号字体,为了保证在任何显示器屏幕上显示的文字 ,输出到打印机后物理大小都一样(就那么大,永恒不变),那么在屏幕上的显示就会有差异了

比如9号字体的尺寸 为打印出来 物理大小 就是 0.1英寸,固定死了。

100%缩放的系统DPI的默认值为:96(每英寸像素点个数),这时windows系统就会计算 认为9号字体应该需要 96*0.1 = 9.6个像素来显示。

调整DPI的值为:100时,9号字体 打印出来还是 0.1英寸,

100*0.1 = 10 个像素来显示。

而对于显示器而言,分辨率不变得情况下,10个像素大小 肯定比9.6个要大,所有我们看到的字就会变大了。

有了这个结论 :困扰我很久的问题找到抓手了。

调整缩放比例后相对坐标会变化吗?

1920*1080

100% 缩放 , 窗口尺寸宽高(920,440)
125% 缩放,  窗口尺寸宽高(1150,550) 变大

1680*1050      观看效果 图像变大 (但是宽高像素点总数不变,同样的道理:相对坐标也不变)

100% 缩放 , 窗口尺寸宽高(920,440)
125% 缩放,  窗口尺寸宽高(1150,550)变大

缩放比例变成1.2 相对坐标也变 1.2

绑定窗口后,获取到按钮A点的 相对坐标 计算方法如下

new_x = x*100% / 1.25(原始相对坐标*原始缩放比例 / new_缩放比例)

调整分辨率后相对坐标会变化吗?

分辨率变了, 相对坐标 不变

调整分辨率后 屏幕某一点的坐标值会变化吗?

会的 ,目前用不到,软件同比例 new_坐标值 = new_分辨率/old_分辨率 * old_坐标值

总结

总结起来,

1、每一台显示器,都有一个最佳分辨率,这是出厂时候就确定了的,变不了!

2、在相同的分辨率下,人们买大显示器,目的是能够在一个屏幕上看更多的东西!

3、相同的屏幕尺寸,分辨率越高,能看到的东西越多,但是东西看起来越小!

4、高分辨率相当于用圆珠笔画画,笔画细;低分辨率相当于用毛笔画画,笔画粗!

现在的iphone,屏幕那么小,但是分辨率超高,显示的东西巨多!但是人眼看久了,会很疲劳,因为东西显示的太小啦

人眼看东西舒不舒服,是依据东西的物理尺寸的,大象永远比老鼠高大,容易发现!但是要精细的画出(用像素点)大象却比画出老鼠更费笔墨(像素点)