我如何使用 python 在任何窗口上绘图

ami*_*867 3 python drawing

我正在制作一个教程来向其他人解释事情。对于该教程,我正在尝试制作一个 python 程序(就像绘画应用程序)

我们都在 Windows 中使用它。用钢笔、画笔进行绘制,绘制方形、圆形等形状,并可以选择颜色选择器来选择要绘制的颜色。

我已经尝试过用from tkinter import choosecolorpython 创建类似绘画的软件。

但它只能在 tkinter 画布上绘制。

但我不想在画布上画画,我想在制作教程时在实时屏幕上画画。

示例图片如下所示

在此输入图像描述

我正在尝试制作一个像这样的 GUI 窗口来选择颜色和钢笔工具在屏幕上绘制(例如桌面、网络浏览器等)。

在此输入图像描述

任何人都可以给我一些关于如何在桌面屏幕或任何窗口上这样绘制的建议。

jiz*_*AMA 5

虽然在你的视频中,似乎是“直接在屏幕上绘制”。实际上,我认为并非如此。

有一个简单的“在屏幕上绘图”的例子,你可以修改它:

import tkinter as tk
from PIL import ImageGrab,ImageTk
import ctypes

ctypes.windll.shcore.SetProcessDpiAwareness(2) # windows 10

class ToolWin(tk.Toplevel):
    def __init__(self):
        tk.Toplevel.__init__(self)
        self._offsetx = 0
        self._offsety = 0
        self.wm_attributes('-topmost',1)
        self.penSelect = tk.BooleanVar()
        self.overrideredirect(1)
        self.geometry('200x200')
        self.penModeId = None
        self.bind('<ButtonPress-1>',self.clickTool) 
        self.bind('<B1-Motion>',self.moveTool) # bind move event

        draw = tk.Checkbutton(self,text="Pen",command=self.penDraw,variable=self.penSelect)
        draw.pack()
        cancel = tk.Button(self,text="Quit",command=root.destroy)
        cancel.pack()

    def moveTool(self,event):
        self.geometry("200x200+{}+{}".format(self.winfo_pointerx()-self._offsetx,self.winfo_pointery()-self._offsety))

    def clickTool(self,event):
        self._offsetx = event.x
        self._offsety = event.y

    def penDraw(self):
        if self.penSelect.get():
            self.penModeId = root.bind("<B1-Motion>",Draw)
        else:
            root.unbind('<B1-Motion>',self.penModeId)

def Draw(event):# r = 3
    fullCanvas.create_oval(event.x-3,event.y-3,event.x+3,event.y+3,fill="black")

def showTool(): # the small tool window
    toolWin = ToolWin()
    toolWin.mainloop()

root = tk.Tk()
root.state('zoomed')
root.overrideredirect(1)

fullCanvas = tk.Canvas(root)
background = ImageTk.PhotoImage(ImageGrab.grab(all_screens=True)) # show the background,make it "draw on the screen".
fullCanvas.create_image(0,0,anchor="nw",image=background)
fullCanvas.pack(expand="YES",fill="both")

root.after(100,showTool)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

此外,您还可以通过拖动来移动工具栏。(PS:我想你快完成了。)