【问题标题】:Draw a line or a series of lines and get the total length of the lines combined?绘制一条线或一系列线并获得组合线的总长度?
【发布时间】:2019-02-19 01:14:41
【问题描述】:

我希望我能把我的想法解释清楚,以便你帮我弄清楚。

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

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

有没有办法在没有积分的情况下做到这一点?只需单击然后再次单击并绘制一条线等等?

【问题讨论】:

  • 要获得长度,特别是,您将需要积分。这是tkinter 库的Canvas 具有create_line() 方法的小部件上的更多documentation。就长度而言,对于 2D,我建议使用math.hypot(),这将使计算变得非常容易(通过将构成每个线段的两个点的坐标 x0-x1 和 y0-y1 之间的差异传递给它) .
  • 既然是你的代码创建了线条,为什么不直接计算每条线的长度,然后将所有长度相加?
  • 谢谢你们,我会进一步研究 Canvas。

标签: python tkinter tcl tk


【解决方案1】:

不需要额外的库。您可以简单地将<Button-1> 绑定到一个事件并使用event.xevent.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()

【讨论】:

  • 非常感谢亨利,您的示例确实帮助我了解了如何完成这项工作。
猜你喜欢
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2020-12-27
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多