簡體   English   中英

Python Tkinter 問題,通過循環檢查鼠標是否在線上單擊(畫布)

[英]Python Tkinter problem with looping to check if mouse clicked on line(canvas)

我想檢查鼠標是否點擊了 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。 我確信這部分代碼工作正常。 到目前為止,該程序在 Canvas 上的 1 行上運行良好(即使我刪除它並繪制一個新的它仍然有效)但不能處理超過 1 行,它只能響應創建的第一行。 即使我刪除了第一行,創建的第二行也不起作用。 我試過打印出每個 onLineCheck() 的結果,似乎循環在每一行中正確循環,但它沒有捕捉到鼠標點擊。 有什么想法可以幫忙嗎?

問題出在以下幾行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM