You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者서가은

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 22:45:05