You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在两个Canvas类之间共享鼠标坐标实现同步绘图

解决方案:Tkinter Canvas子类间同步绘制鼠标轨迹

要实现Canvas子类A中绘制的竖线同步到子类B,核心是让A能将鼠标坐标传递给B并触发绘制。下面是具体实现方案:

修改思路

  1. 让A类持有B类实例的引用,这样A在捕获鼠标事件时可以直接调用B的绘图方法
  2. 给B类新增专门的绘图方法,接收坐标参数完成绘制
  3. 调整实例化顺序,确保创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:49:52