首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Python在屏幕上绘制空矩形

问如何用Python在屏幕上绘制空矩形
EN

Stack Overflow用户
提问于 2020-06-12 09:11:17
回答 4查看 12.4K关注 0票数 4

我不是专家,我试图在屏幕上显示一个矩形,它跟随鼠标从一个固定的起点移动,就像你在文字或绘画中选择什么一样。我带着这个密码来的:

代码语言:javascript
复制
import win32gui
m=win32gui.GetCursorPos()
while True:
    n=win32gui.GetCursorPos()
    for i in range(n[0]-m[0]):
        win32gui.SetPixel(dc, m[0]+i, m[1], 0)
        win32gui.SetPixel(dc, m[0]+i, n[1], 0)
    for i in range(n[1]-m[1]):
        win32gui.SetPixel(dc, m[0], m[1]+i, 0)
        win32gui.SetPixel(dc, n[0], m[1]+i, 0)

如您所见,代码将绘制矩形,但前面的矩形将一直保持到屏幕更新。

我提出的唯一解决方案是,在将像素值设置为黑色之前,将其设置为黑色,并每次重新绘制它们,但这会使我的代码非常慢。有没有一种简单的方法可以更快地更新屏幕以防止这种情况发生?

..。

用溶液编辑。

正如@Torxed所建议的那样,使用win32gui.InvalidateRect解决了更新问题。然而,我发现只设置我需要设置的点的颜色比要求一个矩形更便宜。第一种解决方案相当干净,而第二种解决方案仍然有一点小问题。最后,对我来说最有效的代码是:

代码语言:javascript
复制
import win32gui

m=win32gui.GetCursorPos()
dc = win32gui.GetDC(0)

while True:
    n=win32gui.GetCursorPos()
    win32gui.InvalidateRect(hwnd, (m[0], m[1], GetSystemMetrics(0), GetSystemMetrics(1)), True)
    back=[]
    for i in range((n[0]-m[0])//4):
        win32gui.SetPixel(dc, m[0]+4*i, m[1], 0)
        win32gui.SetPixel(dc, m[0]+4*i, n[1], 0)
    for i in range((n[1]-m[1])//4):
        win32gui.SetPixel(dc, m[0], m[1]+4*i, 0)
        win32gui.SetPixel(dc, n[0], m[1]+4*i, 0)

除法和乘四是必要的,以避免闪烁,但在视觉上与使用DrawFocusRect相同。

这将只有当你保持低沉和右从你的最初立场,但这正是我所需要的。不难改进,接受任何次要职位。

EN

Stack Overflow用户

发布于 2020-06-12 09:25:01

如果您使用OpenCV,那么可以这样做

代码语言:javascript
复制
#draw either rectangles or circles by dragging the mouse like we do in Paint application

import cv2
import numpy as np

drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1

#mouse callback function
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv2.circle(img,(x,y),5,(0,0,255),-1)

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)

#bind this mouse callback function to OpenCV window
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break

cv2.destroyAllWindows()

这是摘自官方的opencv文档这里。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62341134

复制
相关文章

相似问题

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