如何使用 tkinter 沿着鼠标坐标绘制一条线?
How to draw a line following your mouse coordinates with tkinter?
我尝试使用以下代码在 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)
但这不起作用。我尝试了许多其他解决方案,但 none 似乎有效。
这个问题有解决办法吗?
首先,您必须绑定到 "<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()
在的基础上可以进一步定义只在鼠标左键按下时起作用的函数,进一步定义画线的函数:
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()
我尝试使用以下代码在 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)
但这不起作用。我尝试了许多其他解决方案,但 none 似乎有效。
这个问题有解决办法吗?
首先,您必须绑定到 "<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()
在
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()