Python: использовать мышь, чтобы нарисовать прямоугольник вокруг объектов в любом окне?Также сохранить начальную и конечную координаты как переменные относительно указанного окна? - PullRequest
2 голосов
/ 27 сентября 2019

Я очень плохо знаком с Python и мне нужен подход для выполнения важной функции, которую я выполнял ранее на языках макросов:

У меня есть программа на Python, которая будет обрабатывать изображение снимка экрана с помощью pyscreenshot,Чтобы передать pyscreenshot необходимые координаты x1, y1, x2, y2 для создания изображения, мне нужно, чтобы пользователь определил часть экрана, нарисовав вокруг него прямоугольник.Подумайте, «подрезать» инструмент в Windows и cmd + shift + 4 в OSX.

Я открыт для использования любого необходимого модуля BSD, но мне нужна поддержка модулей для OSX и Windows.

Каждый пример, который я нашел, касается того, как нарисовать прямоугольник в пределах холста или в существующем файле изображения.Эти примеры мне не помогают, потому что мне нужно, чтобы координаты были отрисованы относительно любого окна ОС, которое выберет пользователь.

Большое спасибо за помощь !!!

Посмотрел научебники для рисования прямоугольников в opencv, pyautogui, tkinter, но все они рисуют прямоугольники над окном или холстом, нарисованным программой, а не ОС.

1 Ответ

0 голосов
/ 27 сентября 2019

Я бы сначала взял скриншот вашего текущего рабочего стола, отобразил его в Canvas и позволил бы вашему пользователю нарисовать прямоугольник на нем.Затем найдите ограничивающую рамку прямоугольника и выполните фактический захват на рабочем столе.Ниже приведен базовый пример (перетащите для создания изображения):

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()
...