@Brett La Pierre's answer seems doesn't work well on my MacOS device. So I made a version that works on mac (also in Windows I guess).
Using pillow
package.
Install: pip install pillow
import tkinter as tk
from PIL import ImageGrab
class DragScreenShot:
def __init__(self, master):
self.master = master
self.start_x = None
self.start_y = None
self.rect = None
self.canvas = tk.Canvas(master, cursor="cross", background="black")
self.canvas.pack(fill=tk.BOTH, expand=True)
self.canvas.bind("<Button-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_mouse_drag)
self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
def on_button_press(self, event):
self.start_x = event.x
self.start_y = event.y
self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, self.start_x, self.start_y, outline='white', width=2)
def on_mouse_drag(self, event):
self.canvas.coords(self.rect, self.start_x, self.start_y, event.x, event.y)
def on_button_release(self, event):
x1 = min(self.start_x, event.x)
y1 = min(self.start_y, event.y)
x2 = max(self.start_x, event.x)
y2 = max(self.start_y, event.y)
self.canvas.delete(self.rect)
top.withdraw()
dy = abs(y2-y1)
dx = abs(x2-x1)
if dy*dx != 0:
img = ImageGrab.grab(bbox=(x1, y1, x2, y2))
img.save("screenshot.png") # save screenshot here!
print("Screenshot taken!")
top.deiconify()
top.focus_force()
root = tk.Tk()
root.withdraw()
top = tk.Toplevel(root)
window_alpha_channel = 0.3
top.attributes('-alpha', window_alpha_channel)
top.lift()
top.attributes("-topmost", True)
top.attributes("-transparent", True)
top.overrideredirect(True)
top.geometry(f"{root.winfo_screenwidth()}x{root.winfo_screenheight()}+0+0")
app = DragScreenShot(top)
root.mainloop()
It works fine but the resolution is really low (both pyautogui and pillow).
Please share your solution if you guys know how to make it clear.