python-3.x - 在 tkinter 屏幕上执行 ImageGrab

标签 python-3.x tkinter tkinter-canvas imagegrab

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

我无法获取使用 ImageGrab 时 Canvas 的正确位置。

我的相关进口是:

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() 等方法来获取父窗口小部件内的位置(它不必是主窗口),以及 winfo_rootx()winfo_rooty() 获取屏幕上的位置。

Effbot.org:Basic Widget Methods

代码显示 Canvas 在屏幕上和父框架内的位置

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

关于python-3.x - 在 tkinter 屏幕上执行 ImageGrab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653748/

相关文章:

mysql - 如何在 scala/python 中将计算列添加到数据框中?

python - tkinter 文本对齐大量文本

python - 使用 tkinter 在按下按钮时重新启动脚本

python - tkinter Canvas 项目配置

python - 在 Tkinter Canvas 上旋转一个正方形

python - 在函数内部包含 For 循环以处理元组列表

user-interface - Python 3.3 中的现代 GUI 编程

python - 如何配置 Tkinter 列表框以禁用状态保持所选项目突出显示

python - 在 tkinter Canvas 上实时绘图

python - 来自 Python 计数表的箱线图