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