Python 画一条线或一系列线,然后得到这些线的总长度?

Python 画一条线或一系列线,然后得到这些线的总长度?,python,tkinter,tcl,tk,Python,Tkinter,Tcl,Tk,我希望我能把我的想法解释清楚,这样你就能帮我弄明白 假设我单击开始,程序开始“记录”鼠标事件,然后我单击并创建一个点,单击其他位置并创建另一个点,当创建第二个点时,绘制一条连接这两个点的线,依此类推,直到我创建我想要的最后一个点,然后单击停止,然后我得到这些线的长度 用Python实现这一点有多难?有一些库可以帮助我实现这样的东西吗 有没有一种方法可以做到这一点而不需要点呢?只需单击,然后再次单击,即可绘制一条直线,依此类推?不需要额外的库。您可以简单地将绑定到事件,并使用event.x和ev

我希望我能把我的想法解释清楚,这样你就能帮我弄明白

假设我单击开始,程序开始“记录”鼠标事件,然后我单击并创建一个点,单击其他位置并创建另一个点,当创建第二个点时,绘制一条连接这两个点的线,依此类推,直到我创建我想要的最后一个点,然后单击停止,然后我得到这些线的长度

用Python实现这一点有多难?有一些库可以帮助我实现这样的东西吗


有没有一种方法可以做到这一点而不需要点呢?只需单击,然后再次单击,即可绘制一条直线,依此类推?

不需要额外的库。您可以简单地将
绑定到事件,并使用
event.x
event.y
计算距离

from tkinter import *
from random import randint

root = Tk()
root.configure(background='DeepSkyBlue4')

class DrawLine:
    def __init__(self,master):
        self.canvas = Canvas(master, width=500, height=500,bg="white")
        self.canvas.bind("<Button-1>", lambda e: self._move(e.x,e.y))
        self.previous_pos = None
        self.total_length = 0
        self.t = Label(master, text=f"Total Length: {self.total_length} pixels",font=('Arial',12),pady=5,bg="DeepSkyBlue4",fg="white")
        self.t.pack()
        self.canvas.pack()
        self.random_position()

    def _move(self,new_x,new_y):
        self.canvas.create_oval(new_x + 5, new_y + 5, new_x - 5, new_y - 5, width=0, fill='red')
        if self.previous_pos:
            old_x, old_y = self.previous_pos
            self.canvas.create_line(old_x, old_y, new_x, new_y, width=2)
            self.total_length += ((new_x - old_x) ** 2 + (new_y - old_y) ** 2) ** (1 / 2)
            self.t.config(text=f"Total Length: {round(self.total_length,2)} pixels")
        self.previous_pos = (new_x, new_y)

    def random_position(self):
        self._move(randint(0,500),randint(0,500))
        root.after(1000,self.random_position)

DrawLine(root)

root.mainloop()
从tkinter导入*
从随机导入randint
root=Tk()
root.configure(background='DeepSkyBlue4')
级别抽绳:
定义初始(自我,主):
self.canvas=canvas(母版,宽度=500,高度=500,bg=“白色”)
self.canvas.bind(“,lambda e:self.\u move(e.x,e.y))
self.previous_pos=无
self.total_长度=0
self.t=Label(master,text=f“Total Length:{self.Total_Length}像素”,font=('Arial',12),pady=5,bg=“DeepSkyBlue4”,fg=“white”)
self.t.pack()
self.canvas.pack()
self.random_position()
定义移动(自我、新x、新y):
创建椭圆(新的x+5,新的y+5,新的x-5,新的y-5,宽度=0,填充为红色)
如果self.previous\u位置:
old_x,old_y=自身先前位置
self.canvas.create_line(旧_x,旧_y,新_x,新_y,宽度=2)
self.total_length+=((新_x-旧_x)**2+(新_y-旧_y)**2)**(1/2)
self.t.config(text=f“总长度:{round(self.Total_Length,2)}像素”)
self.previous_pos=(新的_x,新的_y)
def随机_位置(自身):
自行移动(randint(0500),randint(0500))
根后(1000,自身随机位置)
抽绳(根部)
root.mainloop()

不需要额外的库。您可以简单地将
绑定到事件,并使用
event.x
event.y
计算距离

from tkinter import *
from random import randint

root = Tk()
root.configure(background='DeepSkyBlue4')

class DrawLine:
    def __init__(self,master):
        self.canvas = Canvas(master, width=500, height=500,bg="white")
        self.canvas.bind("<Button-1>", lambda e: self._move(e.x,e.y))
        self.previous_pos = None
        self.total_length = 0
        self.t = Label(master, text=f"Total Length: {self.total_length} pixels",font=('Arial',12),pady=5,bg="DeepSkyBlue4",fg="white")
        self.t.pack()
        self.canvas.pack()
        self.random_position()

    def _move(self,new_x,new_y):
        self.canvas.create_oval(new_x + 5, new_y + 5, new_x - 5, new_y - 5, width=0, fill='red')
        if self.previous_pos:
            old_x, old_y = self.previous_pos
            self.canvas.create_line(old_x, old_y, new_x, new_y, width=2)
            self.total_length += ((new_x - old_x) ** 2 + (new_y - old_y) ** 2) ** (1 / 2)
            self.t.config(text=f"Total Length: {round(self.total_length,2)} pixels")
        self.previous_pos = (new_x, new_y)

    def random_position(self):
        self._move(randint(0,500),randint(0,500))
        root.after(1000,self.random_position)

DrawLine(root)

root.mainloop()
从tkinter导入*
从随机导入randint
root=Tk()
root.configure(background='DeepSkyBlue4')
级别抽绳:
定义初始(自我,主):
self.canvas=canvas(母版,宽度=500,高度=500,bg=“白色”)
self.canvas.bind(“,lambda e:self.\u move(e.x,e.y))
self.previous_pos=无
self.total_长度=0
self.t=Label(master,text=f“Total Length:{self.Total_Length}像素”,font=('Arial',12),pady=5,bg=“DeepSkyBlue4”,fg=“white”)
self.t.pack()
self.canvas.pack()
self.random_position()
定义移动(自我、新x、新y):
创建椭圆(新的x+5,新的y+5,新的x-5,新的y-5,宽度=0,填充为红色)
如果self.previous\u位置:
old_x,old_y=自身先前位置
self.canvas.create_line(旧_x,旧_y,新_x,新_y,宽度=2)
self.total_length+=((新_x-旧_x)**2+(新_y-旧_y)**2)**(1/2)
self.t.config(text=f“总长度:{round(self.Total_Length,2)}像素”)
self.previous_pos=(新的_x,新的_y)
def随机_位置(自身):
自行移动(randint(0500),randint(0500))
根后(1000,自身随机位置)
抽绳(根部)
root.mainloop()

画布上看一看
()。要获得长度,尤其需要点。下面是有关
tkinter
库的
Canvas
小部件的更多信息,这些小部件具有
create\u line()
方法。就长度而言,对于2D,我建议使用它可以使计算变得非常简单(通过传递构成每个线段的两个点的坐标x0-x1和y0-y1之间的差)。既然是您的代码创建直线,为什么不在绘制直线时计算每条直线的长度呢,然后将所有长度加在一起?谢谢大家,我将进一步查看画布。查看
画布
()。要获得长度,尤其需要点。下面是有关
tkinter
库的
Canvas
小部件的更多信息,这些小部件具有
create\u line()
方法。就长度而言,对于2D,我建议使用它可以使计算变得非常简单(通过传递构成每个线段的两个点的坐标x0-x1和y0-y1之间的差)。既然是您的代码创建直线,为什么不在绘制直线时计算每条直线的长度呢,然后把所有长度加在一起?谢谢你们,我将进一步研究画布。非常感谢亨利,你们的例子真的帮助我了解了如何完成这项工作。非常感谢亨利,你们的例子真的帮助我了解了如何完成这项工作。