Расчет расстояния между двумя координатами с использованием событий щелчка - PullRequest
0 голосов
/ 03 января 2019

Я могу отобразить изображение на своей панели, мне нужно щелкнуть 2 точки на рисунке и рассчитать расстояние между ними. У меня возникли проблемы с обработчиком событий и как использовать его так же, как сканер в Java. Например, если я запускаю программу и щелкаю один раз где-то на изображении, она запускает все 3 метода одновременно, что приводит к ошибке.

root = Tk()

img = ImageTk.PhotoImage(Image.open("target.PNG"))
#img = cv2.imread("target.PNG")
panel = Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")

def leftClick(event):
   global x0,y0
   x0 = event.x
   y0 = event.y
   return x0, y0

panel.bind("<Button-1>", leftClick)

def rightClick(event):
   global x1,y1
   x1 = event.x
   y1 = event.y
   return x1, y1    

 panel.bind("<Button-1>", rightClick)

def getDistance(event):
    distance = math.sqrt( ((x0-x1)**2)+((y0-y1)**2) )
    print(distance)

panel.bind("<Button-1>", getDistance)
root.mainloop()

Что я ищу, так это выполнять каждый шаг по одному за раз. Последний шаг для вычисления расстояния может быть сделан вне метода, который не имеет значения. Мне просто нужно получить координаты, чтобы работать в первую очередь. Пожалуйста, дайте мне знать, как я могу решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Ниже приведена демонстрационная программа для подсчета расстояния от начальной точки до конечной точки, которая выполняет операцию DRAG левой кнопкой мыши.

import tkinter as tk
from PIL import ImageTk, Image
import math
start_point_x, start_point_y, end_point_x, end_point_y = 0, 0, 0, 0

def mouse_left_down_detection(event):
    global start_point_x, start_point_y
    start_point_x = event.x
    start_point_y = event.y

def mouse_left_release_detection(event):
    global end_point_x, end_point_y
    end_point_x = event.x
    end_point_y = event.y
    print(start_point_x, start_point_y, end_point_x, end_point_y)
    print(get_instance(start_point_x, start_point_y, end_point_x, end_point_y))

def get_instance(x1, y1, x2, y2):
    return math.sqrt((pow(abs(x2-x1), abs(x2-x1))+pow(abs(y2-y1), abs(y2-y1))))

image_path = "andy.jpg"
root = tk.Tk()
img = ImageTk.PhotoImage(Image.open(image_path))
panel = tk.Label(root, image=img)
# Bind event mouse left down
panel.bind("<Button-1>", mouse_left_down_detection)
# Bind event mouse left release and calculate distance
panel.bind("<ButtonRelease-1>", mouse_left_release_detection)
panel.pack(side="bottom", fill="both", expand="yes")
root.mainloop()
0 голосов
/ 03 января 2019

Вы можете попробовать это два:

Процесс 1 (Использует щелчок левой кнопкой мыши, щелчок правой кнопкой мыши, щелчок по центру (прокрутка)):

Следующий код принимает

(x0, y0) от щелчка левой кнопкой мыши

(x1, y1) от щелчка правой кнопкой мыши

, а затем печатает расстояние между ними по центру мыши (scroll) -click

from tkinter import *
from PIL import ImageTk, Image
import math

root = Tk()

img = ImageTk.PhotoImage(Image.open("Logo.png"))
panel = Label(root, image=img)
panel.pack(side="bottom", fill="both", expand="yes")
x0 = 0
y0 = 0
x1 = 0
y1 = 0


def leftClick(event):
    global x0, y0
    x0 = event.x
    y0 = event.y
    # return [x0, y0]


panel.bind("<Button-1>", leftClick)


def rightClick(event):
    global x1, y1
    x1 = event.x
    y1 = event.y
    # return x1, y1


panel.bind("<Button-3>", rightClick)


def getDistance(event):
    global x0, y0, x1, y1
    distance = math.sqrt(((x0 - x1)**2)+((y0 - y1)**2))
    print(distance)


panel.bind("<Button-2>", getDistance)
root.mainloop()

Процесс 2 (используется только левый клик мыши):

Следующий код занимает

(x0, y0)от первого щелчка левой кнопкой мыши

(x1, y1) от второго щелчка левой кнопкой мыши

, а затем печатает расстояние между ними при третьем щелчке левой кнопкой мыши

from tkinter import *
from PIL import ImageTk, Image
import math

root = Tk()

img = ImageTk.PhotoImage(Image.open("Logo.png"))
panel = Label(root, image=img)
panel.pack(side="bottom", fill="both", expand="yes")
counter = 0
x0 = 0
x1 = 0
y0 = 0
y1 = 0


def getDistance(event):
    global counter, x0, y0, x1, y1
    if counter == 0:
        x0 = event.x
        y0 = event.y
        counter += 1
    elif counter == 1:
        x1 = event.x
        y1 = event.y
        counter += 1
    elif counter == 2:
        distance = math.sqrt(((x0 - x1)**2)+((y0 - y1)**2))
        print(distance)
        counter = 0


panel.bind("<Button-1>", getDistance)
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...