# 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](http://biji.51automate.cn/blogs/img/image-20230413175527571.png) 从100%调整到150%后,原本看起来很小的桌面图标、文字等 又放大回来了,和1920*1080的显示器差不多。清晰度也更高了 #### 关于DPI 上面 `调大缩放比例(就是调高了系统的DPI)` 给人 放大的效果,其实是桌面图标、文字、软件界面 根据 `调整后的windows系统DPI` 自动进行了UI缩放。 >有些软件并没有做自适应,并不能很好的兼容屏幕的高`DPI`,就会出现 界面模糊、控件错位、文本显示不全等情况,这里不讨论。 > >我用某些软件 [截图时出现屏幕自动放大(大漠绑定窗口时出现放大、错位)解决办法<点击查看](http://mp.weixin.qq.com/s?__biz=MzAxMDg0MTI0Mg==&mid=2247484826&idx=1&sn=d6ccfa0ecacb05ace6bda2911e9bdc9e&chksm=9b4b786fac3cf1798e791fc4dee731f34e330a02bfa879d843a4dde8ed6cabc1a85131cd0094&mpshare=1&scene=24&srcid=0412AYWuJTBU3Qhp3ErPIBUL&sharer_sharetime=1681313990421&sharer_shareid=b58ab3dd2da4f00f1f3f44695959fa6c#rd) 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,屏幕那么小,但是分辨率超高,显示的东西巨多!但是人眼看久了,会很疲劳,因为东西显示的太小啦 人眼看东西舒不舒服,是依据东西的物理尺寸的,大象永远比老鼠高大,容易发现!但是要精细的画出(用像素点)大象却比画出老鼠更费笔墨(像素点)