首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python:在任何窗口中使用鼠标在对象周围绘制矩形?是否也将开始和结束坐标存储为与所述窗口相关的变量?

Python:在任何窗口中使用鼠标在对象周围绘制矩形?是否也将开始和结束坐标存储为与所述窗口相关的变量?
EN

Stack Overflow用户
提问于 2019-09-27 14:16:16
回答 1查看 2K关注 0票数 5

我对Python非常陌生,需要一种方法来实现我以前在宏脚本语言中做过的一个重要功能:

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

我对使用任何必要的BSD模块持开放态度,但我需要OSX和Windows的模块支持。

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

非常感谢你的帮助!

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-27 15:46:00

我首先会抓取您当前桌面的一个屏幕截图,将其显示在Canvas中,然后让您的用户在上面绘制一个矩形。然后检索矩形的边界框并在桌面上执行实际抓取。下面是一个基本示例(拖动以创建图像):

代码语言:javascript
代码运行次数:0
运行
复制
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()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58128787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档