2017-12-27 362 views
0

我曾尝试使用下面的代码来绘制,在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) 

但这不起作用。我尝试了许多其他解决方案,但似乎没有任何工作。

有没有解决这个问题的方法?

回答

3

首先,您必须绑定到"<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() 
+0

谢谢,这有很大的帮助。 – 3141

1

基于Novel's answer可以进一步定义功能,当鼠标左键只按下,并进一步工作,定义一个函数用于绘制线

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

+0

@ 3141 Np。我会进一步研究如何动态显示行,例如ms paint如何做。 – Nae

+0

是的,这是我对这个项目的最终目标,也是为了建立Python的知识。 – 3141