ImageGrab.grab не получает виджет окна tkinter, а область экрана под ним

Попробуйте захватить изображение виджета в окне tkinter, следуя коду, но просто получите область экрана под окном tkinter.

      import ctypes
import platform
from time import sleep
import tkinter as tk

from PIL import ImageGrab

if platform.system() == "Windows" and platform.release() == "10":
    ctypes.windll.shcore.SetProcessDpiAwareness(1)

root = tk.Tk()
root.geometry("+0+0")

var = tk.StringVar()
var.set("Hello World")
entry = tk.Entry(root, width=40, bg='green', takefocus=False, textvariable=var)
entry.pack()

root.update()
# sleep(1)

x, y = entry.winfo_rootx(), entry.winfo_rooty()
width, height = entry.winfo_width(), entry.winfo_height()

im = ImageGrab.grab(bbox=(x, y, x+width, y+height))    # Grab image on screen
im.show()

root.mainloop()

Все будет в порядке, если линия # sleep(1)заменен на sleep(1). Был опробован метод updateили же update_idletasks, все получили одинаковые результаты.

Есть ли способ немедленно завершить работу с окном tkinter? Так что мне не нужно спать одну секунду каждый раз, чтобы захватить изображение виджета. Или я ошибаюсь, любое предложение приветствуется.

1 ответ

Это же очевидно? Для отображения окна требуется некоторое время, но снимок экрана делается довольно быстро. Что я предлагаю? Поместите его внутрь функции и воспользуйтесь преимуществом afterметод здесь.

      def screenshot():
    im = ImageGrab.grab(bbox=(x, y, x+width, y+height))    # Grab image on screen
    im.show()

root.after(1000,screenshot) # Depending on the time required to take show the window
Другие вопросы по тегам