Рисование поверх окон

Хочу сделать програмку на Python, с помощью которой можно рисовать поверх окон.

Другими словами можно будет делать так: введите сюда описание изображения

Как отслеживать положение и клики мыши мне понятно. Но как рисовать поверх других окон я не знаю( Может кто-нибудь помочь?


Ответы (1 шт):

Автор решения: eri

Вам нужно полноэкранное окно с прозрачным фоном. На нем создаете canvas и рисуете в нем.

Реализация зависит от операционной системы и фреймворка.

Для tk на windows:

import tkinter as tk

root = tk.Tk()

root.wait_visibility(root)
root.wm_attributes("-fullscreen", 1)
root.wm_attributes("-transparentcolor", root['bg'])

frame = tk.Frame(root)
frame.pack()

canvas = tk.Canvas(frame, width=root.winfo_width(), height=root.winfo_height())
canvas.pack()
canvas.create_rectangle(50, 25, 150, 75, fill="red")

root.mainloop()

Для linux прозрачность в tk не поддерживается. Вот пример на Gtk-3 c рисованием

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

lines = []
pressed = False

win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
eventbox = Gtk.EventBox()
draw = Gtk.DrawingArea()

def on_draw(area, ctx):
    ctx.set_line_width(1)
    ctx.set_source_rgb(1, 0, 0)
    ctx.fill()
    
    for line in lines:
        ctx.move_to(*line[0])
        for point in line:
            ctx.line_to(*point)
    ctx.stroke()


def on_down(widget, event):
    global  pressed
    print('d',(event.x,event.y))
    line = [(event.x,event.y)]
    lines.append(line)
    pressed = True


def on_up(widget, event):
    global  pressed
    print('u',(event.x,event.y))
    pressed = False
    draw.queue_draw()


def on_move(widget, event):
    global  pressed
    print('m',(event.x,event.y), pressed)
    if pressed:
        lines[-1].append((event.x,event.y))
        draw.queue_draw()


draw.connect("draw", on_draw)
eventbox.connect('button-press-event', on_down)
eventbox.connect('button-release-event', on_up)
eventbox.connect('motion-notify-event', on_move)
eventbox.add(draw)

screen = win.get_screen()
visual = screen.get_rgba_visual()
if visual and screen.is_composited():
    win.set_visual(visual)

win.set_app_paintable(True)
win.add(eventbox)
win.maximize()
win.show_all()
Gtk.main()
→ Ссылка