【问题标题】:how can i draw on any window using python我如何使用 python 在任何窗口上绘图
【发布时间】:2020-04-01 09:27:00
【问题描述】:

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

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

我已经尝试使用from tkinter import choosecolor 在 python 中创建类似绘画的软件。

但它只在 tkinter 画布上绘制。

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

示例图片如下所示

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

谁能给我一些建议,告诉我如何在我的桌面屏幕或任何窗口上进行这样的绘制。

【问题讨论】:

  • 所以只要截个图放到tkinter.Canvas就可以了。
  • @jizhihaoSAMA 不,我想像这样实时绘制 (youtu.be/UNarqPBpWsw?t=300) 看这个例子
  • 将其放入Canvas是第一步。您还需要创建一个Toplevel()来显示工具(添加文字、绘图、创建线条等)。

标签: python drawing


【解决方案1】:

虽然在您的视频中,似乎是“直接在屏幕上绘制”。实际上,我认为不是。

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

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()

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

【讨论】:

  • 笔不完美,会产生点,无法画出正确的线条。而且这没有颜色选择器来绘制不同的颜色。
  • @amit9867 是的,我看到你的代码已经完成了。你可以将这些功能(如颜色选择器)添加到类ToolWin。我只是给你一个想法。你可以修改它来做你想要什么。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2019-07-17
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多