在 tkinter 屏幕上执行 ImageGrab
Performing ImageGrab on tkinter Screen
我正在尝试将 tkinter 屏幕保存到文件(稍后转换为视频)。
我无法获得 canvas 使用 ImageGrab 的正确位置。
我的相关导入是:
import tkinter
import pyscreenshot as ImageGrab
我正在尝试使用(绘制屏幕后)保存屏幕:
grab = ImageGrab.grab(bbox=canvas.bbox())
ImageGrab.grab_to_file(fileName,grab)
我不知道如何使用 "ImageGrab.grab" 获得 canvas 位置。
有没有办法获取整个canvas的边界框,以便以后使用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()
等方法来获取父窗口小部件内的位置(它不必是主要的 window),以及 winfo_rootx()
、winfo_rooty()
获取屏幕上的位置。
Effbot.org: Basic Widget Methods
代码显示 canvas' 在屏幕上和父级内部的位置 Frame
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
我正在尝试将 tkinter 屏幕保存到文件(稍后转换为视频)。
我无法获得 canvas 使用 ImageGrab 的正确位置。
我的相关导入是:
import tkinter
import pyscreenshot as ImageGrab
我正在尝试使用(绘制屏幕后)保存屏幕:
grab = ImageGrab.grab(bbox=canvas.bbox())
ImageGrab.grab_to_file(fileName,grab)
我不知道如何使用 "ImageGrab.grab" 获得 canvas 位置。
有没有办法获取整个canvas的边界框,以便以后使用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()
等方法来获取父窗口小部件内的位置(它不必是主要的 window),以及 winfo_rootx()
、winfo_rooty()
获取屏幕上的位置。
Effbot.org: Basic Widget Methods
代码显示 canvas' 在屏幕上和父级内部的位置 Frame
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