Нарисуйте линию или серию линий и получите общую длину линий? - PullRequest
0 голосов
/ 19 февраля 2019

Я надеюсь, что смогу объяснить свою идею достаточно четко, чтобы вы могли помочь мне разобраться в ней.

enter image description here

Допустим, я нажимаю кнопку "Пуск" ипрограмма начинает «запись» событий мыши, затем я щелкаю и создаю точку, щелкаю где-то еще и создаю другую точку, когда создается вторая точка, рисуется линия, соединяющая эти две точки, и так далее, пока я не создам последнюю точку.желание и нажмите STOP, а затем я получаю взамен длину строк вместе.

Насколько сложно это сделать в Python?Есть библиотеки, которые могут помочь мне реализовать что-то вроде этого?

Есть ли способ сделать это без очков вообще?Просто нажмите, а затем нажмите еще раз, и линия будет нарисована и так далее?

1 Ответ

0 голосов
/ 20 февраля 2019

Дополнительная библиотека не требуется.Вы можете просто привязать <Button-1> к событию и рассчитать расстояние, используя 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()
...