【问题标题】:How to draw a line following your mouse coordinates with tkinter?如何使用 tkinter 在鼠标坐标之后画一条线?
【发布时间】:2017-12-27 17:29:36
【问题描述】:

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

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

这个问题有解决办法吗?

【问题讨论】:

    标签: python tkinter tkinter-canvas


    【解决方案1】:

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

    【讨论】:

    • 谢谢,帮了大忙。
    【解决方案2】:

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

    【讨论】:

    • 感谢您为此付出的时间和精力。
    • @3141 Np。我将进一步研究如何像 ms paint 那样动态显示线条。
    • 是的,这就是我对这个项目的最终目标,也只是为了建立 Python 知识。
    • 我在想,修改 Novel 的代码以使线条默认为白色,然后根据需要将颜色更改为黑色,可能会更简单。
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多