如何修改矩形点击判定逻辑,实现仅点击边框时才绘制绿色标注框
问题场景
我开发的GUI是一个图片幻灯片播放器。原有逻辑为:当用户点击CSV文件中通过left、top、right、bottom坐标定义的正方形任意内部区域时,页面会显示一个绿色框。图片上已预先存在黄色框,用户点击任意黄色框内部即可触发绿色框展示。
目前遇到的问题是部分图片上存在两个正方形重叠的区域,因此需要将逻辑修改为仅当用户点击正方形的边框时,才触发绿色框展示。需要修改的判定条件位置如下:
if t <= y <= b and l <= x <= r:
原完整代码片段如下:
def clicked_evt(self, evt): x, y = evt.x, evt.y # 获取用户点击的x,y坐标 # 从CSV中读取当前图片数据 image_row = self.get_current_image_row() file_name = image_row[CSV_IMAGE_NAME] image_data = self.loaded_images[file_name] for shape in image_data["shapes"]: # 读取每个标注框的坐标 l = int(shape["left"]) t = int(shape["top"]) r = int(shape["right"]) b = int(shape["bottom"]) if t <= y <= b and l <= x <= r: # 判断鼠标点击位置是否在框内 # 绘制绿色选中框 self.canvas.create_rectangle(l, t, r, b, tag="box", outline="green", ) self.canvas.pack(expand=1)
解决方案
你只需要把原有「点在矩形内部即触发」的判断逻辑,替换为「点落在矩形边框的误差允许范围内才触发」的逻辑即可。
你可以自定义一个边界容错值,比如border_tolerance = 3,表示点击位置距离边框在3像素以内都算点击到了,容错值可以根据你的UI实际显示效果调整大小。
把原判断条件替换为以下逻辑即可:
border_tolerance = 3 # 判断是否点击上下边框 y_on_border = abs(y - t) <= border_tolerance or abs(y - b) <= border_tolerance # 判断是否点击左右边框 x_on_border = abs(x - l) <= border_tolerance or abs(x - r) <= border_tolerance # 判断点在矩形范围内且落在边框上 if (t <= y <= b and l <= x <= r) and (x_on_border or y_on_border):
如果你需要支持点击边框外侧一点点也能触发,可以简化判断条件为:
border_tolerance = 3 x_in_range = l - border_tolerance <= x <= r + border_tolerance y_in_range = t - border_tolerance <= y <= b + border_tolerance y_on_border = abs(y - t) <= border_tolerance or abs(y - b) <= border_tolerance x_on_border = abs(x - l) <= border_tolerance or abs(x - r) <= border_tolerance if x_in_range and y_in_range and (x_on_border or y_on_border):
内容的提问来源于stack exchange,提问作者new2python
相关产品推荐
相关产品推荐

