Python: Use mouse to draw a rectangle around objects in any window? Also store start and end coordinates as variables relative to said window?

隐身守侯 提交于 2020-03-22 09:49:30

问题


I'm very new to Python and need an approach for accomplishing an important function I've done before in macro-scripting languages:

I have a Python program that will be processing a screengrab image using pyscreenshot. In order to feed pyscreenshot the necessary x1, y1, x2, y2 coordinates to create the image, I need the user to define the portion of the screen by drawing a rectangle around it. Think "snipping" tool in Windows and cmd+shift+4 in OSX.

I am open to using any BSD module necessary but I need module support for OSX and Windows.

Every example I've found is for how to draw a rectangle within a canvas or on an existing image file. These examples don't help me because I need the coordinates to be drawn-over and relative to any OS window the user chooses.

Thanks so much for the help!!!

Looked at tutorials to draw rectangles in opencv, pyautogui, tkinter but all drew the rectangles over a window or canvas drawn by the program, not the OS.


回答1:


I would first grab a screenshot of your current desktop, display it in a Canvas, and let your user to draw a rectangle on it. Then retrieve the bounding box of the rectangle and perform an actual grab on the desktop. Below is a basic sample (drag to create an image):

import tkinter as tk
from PIL import ImageGrab, ImageTk

class GUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.withdraw()
        self.attributes('-fullscreen', True)

        self.canvas = tk.Canvas(self)
        self.canvas.pack(fill="both",expand=True)

        image = ImageGrab.grab()
        self.image = ImageTk.PhotoImage(image)
        self.photo = self.canvas.create_image(0,0,image=self.image,anchor="nw")

        self.x, self.y = 0, 0
        self.rect, self.start_x, self.start_y = None, None, None
        self.deiconify()

        self.canvas.tag_bind(self.photo,"<ButtonPress-1>", self.on_button_press)
        self.canvas.tag_bind(self.photo,"<B1-Motion>", self.on_move_press)
        self.canvas.tag_bind(self.photo,"<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.x, self.y, 1, 1, outline='red')

    def on_move_press(self, event):
        curX, curY = (event.x, event.y)
        self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)

    def on_button_release(self, event):
        bbox = self.canvas.bbox(self.rect)
        self.withdraw()
        self.new_image = ImageTk.PhotoImage(ImageGrab.grab(bbox))
        self.attributes('-fullscreen', False)
        self.title("Image grabbed")
        self.canvas.destroy()
        self.deiconify()
        tk.Label(self,image=self.new_image).pack()

root = GUI()

root.mainloop()


来源:https://stackoverflow.com/questions/58128787/python-use-mouse-to-draw-a-rectangle-around-objects-in-any-window-also-store-s

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!