Python使用ImageGrab抓取Tkinter窗口截图位置固定的问题如何解决?
问题原因
代码中使用的winfo_reqwidth()、winfo_reqheight()返回的是窗口初始化时声明的预期固定尺寸,不会跟随用户手动调整窗口大小的操作更新,所以不管你怎么拉伸、移动窗口,计算出来的截图区域始终是初始窗口的大小和位置,导致截图结果固定。
修复方案
将上述两个方法替换为winfo_width()、winfo_height(),这两个属性会返回窗口当前的实时实际宽高。
修复后参考代码
def saveasImage(): print("save as image") global im, tk_img, fname,out,img,x,y,x_end,y_end # 先刷新窗口状态,确保拿到最新的位置和尺寸 window.update_idletasks() x=window.winfo_rootx() y=window.winfo_rooty() # 替换为获取实时宽高的方法 x_end = x + window.winfo_width() y_end = y + window.winfo_height() img=ImageGrab.grab((x,y,x_end, y_end)) # 改用获取保存路径的方法,避免文件句柄泄漏 fname = fd.asksaveasfilename(defaultextension='.jpg') if fname: # 判空,避免用户点取消后报错 img.save(fname)
额外适配说明
如果在Windows高DPI缩放场景下仍然出现截图偏移,可以在程序入口处添加DPI感知声明,让系统返回真实的物理坐标:
import ctypes ctypes.windll.shcore.SetProcessDpiAwareness(2)
内容的提问来源于stack exchange,提问作者서가은
相关产品推荐
相关产品推荐

