首页 > 解决方案 > 如何在绘制线条时调用已绑定到 tkinter 画布上的图像的事件处理程序?

问题描述

我的应用在画布上有 2 张图像。我想用一条线连接这两个图像。要求是在第一个图像上右键单击有一个上下文菜单。上下文菜单有一个名为“开始连接”的选项。单击该选项时,从image1开始画一条线到鼠标指针的当前位置,然后当鼠标单击image2时,连接将在image2处结束。我能够使上下文菜单绑定到右键单击,并且该行跟随当前鼠标指针。但现在的问题是,当我单击 image2 时,即使我已将其绑定到事件,单击事件处理程序也不会被触发。

instanceobj 是某个其他类的对象,并且与当前图像相关联。

if_connection_started = False
start_x = 0
start_y = 0
end_x = 0
end_y = 0
start_instance = None
start_instance_imgid = None
prev_line = None
end_img_id = None

@staticmethod
def start_connection(systemcanvas, instanceobj, img_id):
    ClassName.if_connection_started = True
    ClassName.start_x = instanceobj.coord[0]
    ClassName.start_y = instanceobj.coord[1]
    ClassName.start_instance = instanceobj
    ClassName.start_instance_imgid = img_id
    systemcanvas.bind('<Motion>', lambda event, s = systemcanvas:
    ClassName.motion(s, event))

@staticmethod
def motion(systemcanvas, event):
    if ClassName.if_connection_started:
        ClassName.user_drawn = True
        x, y = event.x, event.y
        if ClassName.prev_line:
            systemcanvas.delete(ClassName.prev_line)
        l = systemcanvas.create_line(ClassName.start_x,
                                     ClassName.start_y,
                                     x, y, width = 5)
        ClassName.prev_line = l
        ClassName.end_img_id = systemcanvas.find_overlapping(event.x,
        event.y, event.x, event.y)
        for id in ClassName.end_img_id:
            if systemcanvas.type(id) == 'image':
                systemcanvas.coords(l,x,y,event.x, event.y)

@staticmethod
def end_connection(systemcanvas, instanceobj, dash):
    systemcanvas.delete(ClassName.prev_line)
    ClassName.prev_line = None
    ClassName.if_connection_started = False
    ClassName.end_x = instanceobj.coord[0]
    ClassName.end_y = instanceobj.coord[1]
    ClassName.start_instance_imgid = None
    if ClassName.start_instance != instanceobj:
        Line(ClassName.start_instance, instanceobj, systemcanvas)

Line 是另一个从开始图像到结束图像绘制线条的类。单击图像时,会调用一个名为 select_image() 的方法,该方法又会调用函数 end_connection()。

标签: pythonimagetkintercanvasline

解决方案


推荐阅读