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

前端 未结 2 1666
野趣味
野趣味 2021-01-14 05:54

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         


        
相关标签:
2条回答
  • 2021-01-14 06:21

    Based on Novel's answer you can further define the function to work when the left mouse button is pressed only, and further, define a function for drawing lines:

    import tkinter as tk
    
    def draw(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
    
    def draw_line(event):
    
        if str(event.type) == 'ButtonPress':
            canvas.old_coords = event.x, event.y
    
        elif str(event.type) == 'ButtonRelease':
            x, y = event.x, event.y
            x1, y1 = canvas.old_coords
            canvas.create_line(x, y, x1, y1)
    
    def reset_coords(event):
        canvas.old_coords = None
    
    root = tk.Tk()
    
    canvas = tk.Canvas(root, width=400, height=400)
    canvas.pack()
    canvas.old_coords = None
    
    root.bind('<ButtonPress-1>', draw_line)
    root.bind('<ButtonRelease-1>', draw_line)
    
    #root.bind('<B1-Motion>', draw)
    #root.bind('<ButtonRelease-1>', reset_coords)
    
    root.mainloop()
    
    0 讨论(0)
  • 2021-01-14 06:28

    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()
    
    0 讨论(0)
提交回复
热议问题