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

发布时间 2023-08-07 17:04:47作者: IssacNew

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

 

1 问题:

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

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

 

 

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

 

 

 

2 解决方法:

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

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

 

完整代码如下:

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

from tkinter import *
import pywinauto
win = Tk()
win.geometry("1270x725")  

win.mainloop()

 

 

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

 

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

 

 

3 溯源:

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

也就是说: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而不是坐标 。