如何实现点击按钮截取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
相关产品推荐
相关产品推荐

