Python:使用鼠标在任何窗口中围绕对象绘制一个矩形?还将开始和结束坐标存储为相对于所述窗口的变量?

标签 python user-interface input mouse store

我是 Python 的新手,需要一种方法来完成我以前用宏脚本语言完成的重要功能:

我有一个 Python 程序,它将使用 pyscreenshot 处理截屏图像。为了向 pyscreenshot 提供必要的 x1、y1、x2、y2 坐标以创建图像,我需要用户通过在其周围绘制一个矩形来定义屏幕部分。想想 Windows 中的“截图”工具和 OSX 中的 cmd+shift+4。

我愿意使用任何必要的 BSD 模块,但我需要对 OSX 和 Windows 的模块支持。

我找到的每个示例都是关于如何在 Canvas 内或现有图像文件上绘制矩形的。这些示例对我没有帮助,因为我需要绘制坐标并相对于用户选择的任何操作系统窗口。

非常感谢您的帮助!!!

查看了在 opencv、pyautogui、tkinter 中绘制矩形的教程,但都在程序而非操作系统绘制的窗口或 Canvas 上绘制了矩形。

最佳答案

我会先抓取您当前桌面的屏幕截图,将其显示在 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()

关于Python:使用鼠标在任何窗口中围绕对象绘制一个矩形?还将开始和结束坐标存储为相对于所述窗口的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128787/

相关文章:

python - 在 BeautifulSoup 中查找特定属性

python - Discord Bot Python 命令的冷却时间

python - 如何找到用 matplotlib 绘制的图传递的像素

css - 如何仅在 CSS 中构建此图标?

wpf - 有没有人注意到,当双击选择一个文件时,WPF 文件对话框会将点击传递到 UI?

python - 如何从 DB 或 draw.io 图表生成 SQLAlchemy 代码?

java - TAB 键在 NetBeans 8 中不起作用

javascript - 如何在 JavaScript/jQuery 和 HTML 中使用国际数字系统计算数字?

html - 选择一个单选按钮后无法选择另一个单选按钮

c++ - Win32 在文本框中输入时触发确定按钮