79166810

Date: 2024-11-07 14:11:18
Score: 2.5
Natty:
Report link

A Solution which works on MacOS too

@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.

Reasons:
  • RegEx Blacklisted phrase (2.5): Please share your solution
  • Long answer (-1):
  • Has code block (-0.5):
  • User mentioned (1): @Brett
  • Low reputation (0.5):
Posted by: Jacky