![](/img/trans.png)
[英]is it possible to find the canvas shape clicked in a mouse button press event in 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.