How to draw a line following your mouse coordinates with tkinter?

3141 picture 3141 · Dec 27, 2017 · Viewed 7k times · Source

I have tried using the following code to draw points that create a line in tkinter:

import tkinter as tk
from time import sleep

def myfunction(event):
    x, y = event.x, event.y
    x1 = (x+1)
    y1 = (y+1)
    canvas.create_line(x, y, x1, y1)
    sleep(0.5)



root = tk.Tk()

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()

root.bind('d', myfunction)


root.mainloop()

Understandably, the program only draws a point when I press 'd'. I have tried using loops within the myfunction function like this:

def myfunction(event):
    x, y = event.x, event.y
    x1 = (x+1)
    y1 = (y+1)
    for x in range(0,5):
        canvas.create_line(x, y, x1, y1)
        sleep(0.1)

but this does not work. I have tried many other solutions but none seem to work.

Is there a solution to this problem?

Answer

Novel picture Novel · Dec 27, 2017

First, you have to bind to the "<Motion>" event, which will fire every time the mouse moves.

Then you need to save the previous mouse coordinates so that you have a place to draw the line from.

Like this:

import tkinter as tk

def myfunction(event):
    x, y = event.x, event.y
    if canvas.old_coords:
        x1, y1 = canvas.old_coords
        canvas.create_line(x, y, x1, y1)
    canvas.old_coords = x, y

root = tk.Tk()

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
canvas.old_coords = None

root.bind('<Motion>', myfunction)
root.mainloop()