Python 3.x 在tkinter屏幕上执行图像抓取

Python 3.x 在tkinter屏幕上执行图像抓取,python-3.x,tkinter,tkinter-canvas,imagegrab,Python 3.x,Tkinter,Tkinter Canvas,Imagegrab,我正在尝试将tkinter屏幕保存到文件中(以便稍后转换为视频) 我无法使用ImageGrab获得画布的正确位置 我的相关进口是: import tkinter import pyscreenshot as ImageGrab 我正在尝试使用(绘制屏幕后)保存屏幕: 我不知道如何使用“ImageGrab.grab”获得画布位置 有没有办法获取整个画布的边界框,以便以后使用ImageGrab存储屏幕截图 --编辑----------------------------------------

我正在尝试将tkinter屏幕保存到文件中(以便稍后转换为视频)

我无法使用ImageGrab获得画布的正确位置

我的相关进口是:

import tkinter
import pyscreenshot as ImageGrab 
我正在尝试使用(绘制屏幕后)保存屏幕:

我不知道如何使用“ImageGrab.grab”获得画布位置

有没有办法获取整个画布的边界框,以便以后使用ImageGrab存储屏幕截图

--编辑-------------------------------------------------------------------

解决方案:

box = (canvas.winfo_rootx(),canvas.winfo_rooty(),canvas.winfo_rootx()+canvas.winfo_width(),canvas.winfo_rooty() + canvas.winfo_height())
grab = ImageGrab.grab(bbox = box)
grab.save(file_path)

您可以使用
winfo_x()
winfo_y()
等方法在父窗口小部件中获取位置(不必是主窗口),以及
winfo_rootx()
winfo_rooty()
等方法在屏幕上获取位置

Effbot.org:

代码显示画布在屏幕上和父帧内部的位置

import tkinter as tk

def callback():
    print('  root.geometry:', root.winfo_geometry())
    print('canvas.geometry:', canvas.winfo_geometry())
    print('canvas.width :', canvas.winfo_width())
    print('canvas.height:', canvas.winfo_height())
    print('canvas.x:', canvas.winfo_x())
    print('canvas.y:', canvas.winfo_y())
    print('canvas.rootx:', canvas.winfo_rootx())
    print('canvas.rooty:', canvas.winfo_rooty())

root = tk.Tk()

tk.Label(root, text='SOME WIDGETS IN ROOT').pack()

frame = tk.Frame(root)
frame.pack()

tk.Label(frame, text='SOME WIDGETS IN FRAME').pack()

canvas = tk.Canvas(frame, bg='green')
canvas.pack()

print('\n--- before mainloop start---\n')
callback()

print('\n--- after mainloop start ---\n')
root.after(100, callback)

root.mainloop()
示例结果

--- before mainloop start ---

  root.geometry: 1x1+0+0
canvas.geometry: 1x1+0+0
canvas.width : 1
canvas.height: 1
canvas.x: 0
canvas.y: 0
canvas.rootx: 0
canvas.rooty: 0

--- after mainloop start ---

  root.geometry: 380x303+770+462
canvas.geometry: 380x267+0+18
canvas.width : 380
canvas.height: 267
canvas.x: 0
canvas.y: 18
canvas.rootx: 770
canvas.rooty: 498

尝试
canvas.winfo_geometry()
和其他类似魅力的作品。
--- before mainloop start ---

  root.geometry: 1x1+0+0
canvas.geometry: 1x1+0+0
canvas.width : 1
canvas.height: 1
canvas.x: 0
canvas.y: 0
canvas.rootx: 0
canvas.rooty: 0

--- after mainloop start ---

  root.geometry: 380x303+770+462
canvas.geometry: 380x267+0+18
canvas.width : 380
canvas.height: 267
canvas.x: 0
canvas.y: 18
canvas.rootx: 770
canvas.rooty: 498