如何使用tkinter根据鼠标坐标绘制一条直线?

4

我尝试使用以下代码在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()

可以理解的是,当我按下“d”键时,程序只会画一个点。我尝试在myfunction函数中使用循环,如下:

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)

但是这并不起作用。我尝试了许多其他的解决方案,但似乎没有一个可以解决这个问题。
有解决这个问题的方法吗?
2个回答

9

首先,您需要绑定到"<Motion>"事件,每次鼠标移动时都会触发该事件。

然后,您需要保存先前的鼠标坐标,以便您有一个可以从中绘制线条的位置。

像这样:

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

谢谢,这帮了很大的忙。 - 3141

2

根据Novel的回答,您可以进一步定义函数仅在按下左键时工作,并进一步定义绘制线条的函数:

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

1
非常感谢您所花费的时间和努力。 - 3141
@3141 没问题。我会进一步研究如何像 MS Paint 一样动态显示线条。 - Nae
是的,这是我的最终目标,也是为了增强Python知识而构建此项目。 - 3141
我在思考,修改Novel的代码将线条颜色默认为白色,然后按需更改颜色为黑色可能会更简单。 - 3141

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接