Search code examples
pythontkinterdrawtkinter-canvas

How to draw an image, so that my image is used as a brush


I created this little algorithm that is supposed to draw an image (imagine that my brush is an image) so that when I keep clicking I will draw the image, but as you can see if you test the code, it does not paint.

What it does is just moves the image across the Canvas.

Is there a way for the image to remain on the Canvas?

Here is my code:

from tkinter import *
from PIL import Image, ImageTk

master = Tk()
w = Canvas(master, width=800, height=400)
w.pack(expand = YES, fill = BOTH)
imagen = Image.open('C:/Users/Andres/Desktop/hola.png')
P_img = ImageTk.PhotoImage(imagen)

def paint( event ):
    global w, P_img_crop
    #I get the mouse coordinates
    x, y = ( event.x - 1 ), ( event.y - 1 )
    #I open and draw the image
    img_crop = Image.open('C:/Users/Andres/Desktop/papa.png')
    P_img_crop = ImageTk.PhotoImage(img_crop)
    w.create_image((x,y), anchor=NW, image=P_img_crop)

w.bind( "<B1-Motion>", paint )
mainloop()

Solution

  • I GOT IT I did not know that the image that was drawn on the canvas, should be saved, so what I did is store the images in a matrix, which belongs to the canvas. Here is the code, just in case ...

    from tkinter import *
    from PIL import Image, ImageTk
    
    master = Tk()
    w = Canvas(master, width=800, height=400)
    w.dib = [{} for k in range(10000)]
    w.pack(expand = YES, fill = BOTH)
    puntero = 0
    
    def paint( event ):
        global w, P_img_crop, puntero
        #I get the mouse coordinates
        x, y = ( event.x - 1 ), ( event.y - 1 )
        #I open and draw the image
        img_crop = Image.open('C:/Users/Andres/Documents/PROYECTOS INCONCLUSOS/PAINT MATEW PYTHON/hola.png')
        w.dib[puntero]['image'] = ImageTk.PhotoImage(img_crop)
        w.create_image((x,y), anchor=NW, image=w.dib[puntero]['image'])
        puntero += 1
        if(puntero >=10000):
            puntero = 0
    
    w.bind( "<B1-Motion>", paint )
    mainloop()