首页 > 头条

解决方案 | 在 Tkinter 中导入 pywinauto/pyautogui 时窗口大小发生变化

来源:博客园 2023-08-07 17:27:16

上面问题也可以换一个说法,pywinauto/pyautogui 时改变了tkinter的原有的窗口大小。这个问题困扰了我好几天而且网上有这样的问题但是并没有答案,今天摸索出答案给大家分享下。解决方法非常简单。

1 问题:

pywinauto/pyautogui 时改变了tkinter的原有的窗口大小。


【资料图】

看动图可以发现区别:加了pywinauto会导致tkinter界面发生缩放,一般发生于使用外接显示屏或者把显示器比例调整到非100%,如125%、150%时候。

下面以import pywinauto为例,可以发现导入pywinauto之后马上界面变小了。

2 解决方法:

在代码最顶部增加2行代码:

import ctypesctypes.windll.shcore.SetProcessDpiAwareness(0) #解决缩放

完整代码如下:

import ctypesctypes.windll.shcore.SetProcessDpiAwareness(0) #解决缩放from tkinter import *import pywinautowin = Tk()win.geometry("1270x725")  win.mainloop()

取值0、1、2的意义如下。0代表不感知系统显示器分辨率的缩放问题。

使用效果如下(导入了2行代码后那么尺寸可以被强行放大到了你原始的tkinter尺寸,这恰好是你需要的):

3 溯源:

pywinauto问题发生原因是C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinautowin32functions.pySetProcessDpiAwareness设置。

也就是说:pywinauto为了准确识别屏幕分辨率默认把分辨率按照原始尺寸(100%)。但是由于你把显示器的分辨率改成了125%那么pywinauto感知到了这一点就强行给你恢复了。

对于pyautogui是同理的。发生于C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyautogui _pyautogui_win.py SetProcessDpiAwareness.

4 注意事项:

可能带来的问题,我没试过但是我猜的是可能会发生。当我们强行使用ctypes.windll.shcore.SetProcessDpiAwareness(0) #解决缩放问题后,那么不感知分辨率的放大问题了,可能带来那些通过pywinauto或者pyautogui使用坐标相关的点击可能带来问题,解决方法是直接使用读取 button对象进行click而不是坐标 。

上一篇 下一篇
推荐阅读
相关新闻