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

如何实现点击按钮截取Tkinter中指定Frame区域的截图

实现Tkinter指定Frame区域截图的方案

核心逻辑是先获取目标Frame在屏幕上的精确位置与尺寸,再传入截图方法的区域参数即可。

问题根因

你当前的代码直接调用pyautogui.screenshot()没有指定截取范围,默认会截取全屏,所以无法单独拿到Frame的内容。

具体实现修改

步骤1:获取Frame的位置与尺寸

Tkinter控件内置了位置、尺寸查询方法:

  • winfo_rootx():控件左上角相对于屏幕左侧的像素坐标
  • winfo_rooty():控件左上角相对于屏幕顶部的像素坐标
  • winfo_width():控件的宽度(像素)
  • winfo_height():控件的高度(像素)
    注意:需要先调用窗口的update()方法确保控件已经完成渲染,否则可能拿到0值

步骤2:修改截图函数

将你原有的screenshot函数替换为以下代码即可:

def screenshot():
    # 刷新窗口状态,确保获取到正确的控件参数
    win.update()
    # 读取目标Frame的坐标和尺寸
    frame_x = frm2shoot.winfo_rootx()
    frame_y = frm2shoot.winfo_rooty()
    frame_w = frm2shoot.winfo_width()
    frame_h = frm2shoot.winfo_height()
    
    random = int(time.time())
    filename = f"/Users/ricardosimoes/Desktop/{random}.jpg"
    # 传入region参数指定截图区域
    ss = pg.screenshot(filename, region=(frame_x, frame_y, frame_w, frame_h))
    ss.show()

常见坑点提醒

  • 如果系统开启了DPI缩放(Windows常见),拿到的坐标会和实际像素有偏差,需要乘以系统缩放比例再传入region参数
  • 如果目标Frame被其他窗口遮挡,截图会包含遮挡的窗口内容,如果需要后台无干扰截图,可以先将Tkinter窗口置顶后再截图
  • 你原有代码中的frm2shoot.deiconify()无实际作用,如果你没有做最小化Frame的逻辑可以直接删除

内容的提问来源于stack exchange,提问作者newbPyth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 03:24:04