Python Tkinter проблема с циклом, чтобы проверить, нажата ли мышь в строке (холст) - PullRequest
0 голосов
/ 21 марта 2020

Я хочу проверить, щелкнула ли мышь по строке на холсте Tkinter или нет, если по строке, то по какой строке. Я сделал это для обнаружения щелчков мыши.

class Link:
    def __init__(self,Node1,Node2,canvas,width=5):
        if self not in canvas.LinkList:
            self.start_coor = Node1.Centre
            self.final_coor = Node2.Centre
            self.Canvas = canvas
            self.Width = width
            self.Shape = canvas.create_line(self.start_coor,self.final_coor,width=width)
            Node1.connected(Node2)
            self.Canvas.LinkList.append(self)
            self.Nodes = [Node1,Node2]

            self.Clicked = False

            dy = self.final_coor[1] - self.start_coor[1]
            dx = self.final_coor[0] - self.start_coor[0]
            self.m = dy/dx
            self.c = self.start_coor[1] - self.m*self.start_coor[0]

    def onLineCheck(self,x,y,field=False):
        #y = mx + c
        #y - mx - c = 0
        if not field:
            field = self.Width
        if (x < self.start_coor[0] and x < self.final_coor[1]) or (x > self.start_coor[0] and x > self.final_coor[1]) or (y < self.start_coor[1] and y < self.final_coor[1]) or (y > self.start_coor[1] and y > self.final_coor[1]):
            return False
        temp =  y - (self.m*x) - self.c
        if abs(temp) <= field:
            return True
        return False
class InputCanvas(Canvas):

    def __init__(self,master=None, **kw):
        super().__init__(master,**kw)
        self.NodeList = []
        self.LinkList = []
        self.Mode = "Nodes"
    def anyLinkClicked(self,e):
        x,y = getMousePosition(e)
        for l in self.LinkList:
            if l.onLineCheck(x,y):
                return l
        return False

Каждый раз, когда создается ссылка, она автоматически добавляется в canvas.LinkList. Я уверен, что эта часть кода работает правильно. Пока что программа хорошо работает с 1 строкой на Canvas (даже если я удалю ее и нарисую новую, она все еще работает), но не может обработать более 1 строки, она может отвечать только на первую созданную строку. Даже если я удалю первую строку, вторая созданная строка не будет работать. Я попытался распечатать результат каждого onLineCheck (), похоже, что l oop правильно проходит по каждой строке, но не ловит щелчки мышью. Любая идея, чтобы помочь?

1 Ответ

0 голосов
/ 21 марта 2020

Проблема в следующей строке:

if (x < self.start_coor[0] and x < self.final_coor[1]) or (x > self.start_coor[0] and x > self.final_coor[1]) or (y < self.start_coor[1] and y < self.final_coor[1]) or (y > self.start_coor[1] and y > self.final_coor[1]):
    return False
  • x < self.final_coor[1] должно быть x < self.final_coor[0]
  • x > self.final_coor[1] должно быть x > self.final_coor[0]

Также вы должны также обслуживать вертикальная линия , т. Е. dx равен нулю, поскольку ваш код повысит ZeroDivisionError: division by zero.

Вы можете использовать функцию Canvas.find_overlapping(), чтобы найти, какая Link нажата:

def anyLinkClicked(self, e):
    x, y = getMousePosition(e)
    found = self.find_overlapping(x, y, x, y)
    if found:
        for l in self.LinkList:
            if found[0] == l.Shape:
                return l
    return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...