如何在两个Canvas类之间共享鼠标坐标实现同步绘图
解决方案:Tkinter Canvas子类间同步绘制鼠标轨迹
要实现Canvas子类A中绘制的竖线同步到子类B,核心是让A能将鼠标坐标传递给B并触发绘制。下面是具体实现方案:
修改思路
- 让A类持有B类实例的引用,这样A在捕获鼠标事件时可以直接调用B的绘图方法
- 给B类新增专门的绘图方法,接收坐标参数完成绘制
- 调整实例化顺序,确保创建A时能传入已初始化的B实例
修改后的完整代码
from tkinter import* def main(): display() def display(): fen=Tk() fen.title("Test") fen.geometry("500x200+50+50") fen.configure(bg='green') # 先实例化B,再把B传给A b = B(fen) b.configure(bg="White", bd=2, relief=SUNKEN) b.grid(row=2, column=1) a = A(fen, b_canvas=b) a.configure(bg='white', bd=2, relief=SUNKEN) a.grid(row=1,column=1) class A(Canvas): def __init__(self, fen, b_canvas, larg=500, haut=100): Canvas.__init__(self, fen) self.configure(width=larg, height=haut) self.larg, self.haut = larg, haut self.b_canvas = b_canvas # 保存B的实例引用 self.bind('<Motion>', self.callback) def callback(self, event): x, y = event.x, event.y # A自己绘制竖线 self.create_line(x, 0, x, 100, width=1) # 通知B绘制相同的竖线 self.b_canvas.draw_vertical_line(x) class B(Canvas): def __init__(self, fen, larg=500, haut=100): Canvas.__init__(self, fen) self.configure(width=larg, height=haut) self.larg, self.haut = larg, haut def draw_vertical_line(self, x): # 接收x坐标,绘制竖线 self.create_line(x, 0, x, 100, width=1) main()
关键改动说明
- A类构造函数新增参数:添加
b_canvas参数,传入B的实例并保存为成员变量,让A能直接访问B的方法 - A的鼠标回调增强:在自己绘制线条后,调用B的
draw_vertical_line方法,把当前鼠标x坐标传递过去 - B类新增绘图方法:把原来固定x的绘制逻辑改成可接收参数的方法,实现按需绘制
- 实例化顺序调整:先创建B再创建A,确保传入A的B实例已经初始化完成
如果需要避免类之间的直接耦合,也可以用回调函数或者发布订阅模式,但对于这个简单场景,直接传递实例引用是最直观高效的方式。
内容的提问来源于stack exchange,提问作者Jean-Michel Grilly
相关产品推荐
相关产品推荐

