Рисование поверх окон
Хочу сделать програмку на 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()