Как свернуть приложение tkinter, прежде чем делать скриншот, а затем развернуть - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть python скрипт приложения tkinter, который может делать снимки экрана при нажатии кнопки. Но, к сожалению, при съемке скриншота окно приложения также захватывается.

Вот код приложения:

from PIL import ImageGrab
import tkinter as tk
from tkinter import filedialog
import time


def takeShot():
    sc = ImageGrab.grab()
    path = filedialog.asksaveasfilename(defaultextension='.png')
    sc.save(path)

root = tk.Tk()

canvas1 = tk.Canvas(root,width=300,height=300)
canvas1.pack()

but = tk.Button(text='Take Screenshot',command=takeShot,bg='green',fg='white',font=10)
canvas1.create_window(150,150,window=but)

root.mainloop()

Хотя снимок экрана снимается, но окно приложения также захватывается

sample screenshot taken by this app

Мне не нужно это белое окно на скриншоте. Я попытался свернуть окно, а затем развернуть его, обновив функцию следующим образом:

def takeShot():
    root.withdraw()
    sc = ImageGrab.grab()
    root.deiconify()
    path = filedialog.asksaveasfilename(defaultextension='.png')
    sc.save(path)

, но она не сработала.

Есть ли способ свернуть приложение, а затем выполнить снимок экрана, а затем разверните его для сохранения диалогового окна, чтобы захватить весь экран ??

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

У меня нет проблемы в моем Windows работающем Python 3.8.1. Однако я предлагаю переместить asksaveasfilename(...) сразу после root.withdraw(), так как asksaveasfilename(...) является модальным диалоговым окном и возвращается после его закрытия:

def take_snapshot():
  root.withdraw()
  filename = filedialog.asksaveasfilename(initialdir='.', defaultextension='.png')
  if filename:
    image = ImageGrab.grab()
    image.save(filename)
  root.deiconify()
0 голосов
/ 12 февраля 2020

Вам нужно позвонить root.update_idletasks() после вызова root.withdraw(), чтобы заставить tkinter перерисовать окно (или в этом случае, чтобы убрать окно из вида).

Если вы обнаружите, что root.update_idletasks() не заставляет окно прятаться на вашей платформе, вы можете попробовать root.update(). update_idletasks должно работать, хотя.

...