pyside2系列:DPI自适应窗口程序-根据页面缩放和分辨率自动改变
实际应用过程中会涉及到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 确可以发送成功(并且可以支持后台操作)

为什么分辨率调小后不能全屏 且 软件变大了?
比如你是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%(用系统推荐的即可)

从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,屏幕那么小,但是分辨率超高,显示的东西巨多!但是人眼看久了,会很疲劳,因为东西显示的太小啦
人眼看东西舒不舒服,是依据东西的物理尺寸的,大象永远比老鼠高大,容易发现!但是要精细的画出(用像素点)大象却比画出老鼠更费笔墨(像素点)