吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 461|回复: 10
收起左侧

[求助] 使用Python,请问如何直接在桌面上绘制图形?

[复制链接]
Cateners 发表于 2024-5-15 22:19
如题,比如我要直接在桌面中间绘制一个半透明的圆。它会始终显示在最上层;透过圆可以看到下面桌面的内容。没有窗口、框框什么的!
其实就是类似桌宠,或悬浮球那样的东西。这些是怎么实现的呢?

我主要是想用Python实现,请问可以实现吗?要用到哪些技术(或库)?
谢谢解答!

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

戮之使 发表于 2024-5-15 23:39
不建议用python
我心飞翔1995 发表于 2024-5-16 00:24
qt有相关技术实现,可以使用pyside,即qt的python绑定
jjjzw 发表于 2024-5-16 00:25
pyqt应该可以做,但是透明部分的事件穿透我没有研究过
你好,再见 发表于 2024-5-16 00:50
调用SetWindowLongA函数可实现窗口透明以及鼠标穿透功能
18834161486 发表于 2024-5-16 07:59
我用pyqt实现过植物大战僵尸的绘制,应该跟你说的一样
 楼主| Cateners 发表于 2024-5-16 08:19
好的,我去了解一下。谢谢大家解答!
smnra 发表于 2024-5-16 09:04
刚好前两天找过    用 win32api  在桌面上 绘制  


[Python] 纯文本查看 复制代码
import time
import win32gui

dc = win32gui.GetDC(0)


# 中点算法画圆
def draw_circle(x, y, r,delay=0.001,lineClour=0x123456):
    x0 = 0
    y0 = r
    d = 3 - 2 * r
    while x0 <= y0:
        win32gui.SetPixel(dc, x + x0, y + y0, lineClour)
        win32gui.SetPixel(dc, x + y0, y + x0, lineClour)
        win32gui.SetPixel(dc, x - y0, y + x0, lineClour)
        win32gui.SetPixel(dc, x - x0, y + y0, lineClour)
        win32gui.SetPixel(dc, x - x0, y - y0, lineClour)
        win32gui.SetPixel(dc, x - y0, y - x0, lineClour)
        win32gui.SetPixel(dc, x + y0, y - x0, lineClour)
        win32gui.SetPixel(dc, x + x0, y - y0, lineClour)
        time.sleep(delay)
        if d < 0:
            d += 4 * x0 + 6
        else:
            d += 4 * (x0 - y0) + 10
            y0 -= 1
        x0 += 1


# 画线
def bresenham(x0, y0, x1, y1,lineClour=0x123456):
    dx = abs(x1 - x0)
    dy = abs(y1 - y0)
    sx = 1 if x0 < x1 else -1
    sy = 1 if y0 < y1 else -1
    err = dx - dy

    while True:
        # time.sleep(0.01)
        win32gui.SetPixel(dc, x0, y0, lineClour)
        if x0 == x1 and y0 == y1:
            break
        e2 = 2 * err
        if e2 > -dy:
            err -= dy
            x0 += sx
        if e2 < dx:
            err += dx
            y0 += sy


# 画实心圆
def draw_circle_fill(x0, y0, r,delay=0.001,lineClour=0x123456):
    x = 0
    y = r
    d = 3 - 2 * r
    while x <= y:
        bresenham(x0 + x, y0 + y, x0 - x, y0 + y, lineClour)
        bresenham(x0 + x, y0 - y, x0 - x, y0 - y, lineClour)
        time.sleep(delay)
        bresenham(x0 + y, y0 + x, x0 - y, y0 + x, lineClour)
        bresenham(x0 + y, y0 - x, x0 - y, y0 - x, lineClour)
        if d < 0:
            d += 4 * x + 6
        else:
            d += 4 * (x - y) + 10
            y -= 1
        x += 1


# 画多边形
def draw_polygon(points,delay=0.001,lineClour=0x123456):
    for i in range(len(points)):
        x0 = points[i][0]
        y0 = points[i][1]
        x1 = points[(i + 1) % len(points)][0]
        y1 = points[(i + 1) % len(points)][1]
        bresenham(x0, y0, x1, y1,lineClour)
        time.sleep(delay)

# 画椭圆
def draw_ellipse(x0, y0, a, b,delay=0.001,lineClour=0x123456):
    x = 0
    y = b
    a2 = a * a
    b2 = b * b
    d = b2 - a2 * b + a2 / 4
    while b2 * x <= a2 * y:
        win32gui.SetPixel(dc, x0 + x, y0 + y, lineClour)
        win32gui.SetPixel(dc, x0 - x, y0 + y, lineClour)
        win32gui.SetPixel(dc, x0 + x, y0 - y, lineClour)
        win32gui.SetPixel(dc, x0 - x, y0 - y, lineClour)
        if d < 0:
            d += b2 * (2 * x + 3)
        else:
            d += b2 * (2 * x - 2 * y + 5)
            y -= 1
        x += 1
    d1 = b2 * (x + 0.5) * (x + 0.5) + a2 * (y - 1) * (y - 1) - a2 * b2
    while y >= 0:
        time.sleep(delay)
        win32gui.SetPixel(dc, x0 + x, y0 + y, lineClour)
        win32gui.SetPixel(dc, x0 - x, y0 + y, lineClour)
        win32gui.SetPixel(dc, x0 + x, y0 - y, lineClour)
        win32gui.SetPixel(dc, x0 - x, y0 - y, lineClour)
        if d1 > 0:
            d1 -= a2 * (2 * y - 1)
        d1 += b2 * (2 * x + 3)
        x += 1
        y -= 1


# 画矩形
def draw_rectangle(x0, y0, x1, y1,delay=0.001,lineClour=0x123456):
    bresenham(x0, y0, x1, y0,lineClour)
    bresenham(x1, y0, x1, y1,lineClour)
    bresenham(x1, y1, x0, y1,lineClour)
    bresenham(x0, y1, x0, y0,lineClour)
    time.sleep(delay)




if __name__=='__main__':

    while True:

        # 画线
        # bresenham(400, 900, 1000, 700)

        # 中心圆
        draw_circle(1000, 200, 100, 0.001,0x0000FF)

        # 椭圆
        draw_ellipse(1500, 200, 100, 100, 0.001,0xFF0000)

        # 矩形
        draw_rectangle(1100, 400, 1200, 500, 0.001,0x00FF00)

        # 多边形
        draw_polygon([(900, 1000), (800, 800), (1000, 900), (1100, 1000)], 0.001,0x123456)
    
        # 三角形
        draw_polygon([(400, 200), (500, 300), (600, 200)], 0.001,0x123456)



你好,再见 发表于 2024-5-16 10:56
smnra 发表于 2024-5-16 09:04
刚好前两天找过    用 win32api  在桌面上 绘制  

大佬请问一下这样画出来不会有锯齿吗
smnra 发表于 2024-5-16 10:58
你好,再见 发表于 2024-5-16 10:56
大佬请问一下这样画出来不会有锯齿吗

这肯定会有的.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-10 22:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表