如何在 2 个班级之间共享鼠标坐标

How to share mouse coordinates between 2 class

提问人:Jean-Michel Grilly 提问时间:10/30/2023 更新时间:10/30/2023 访问量:44

问:

目标是在 canvas 类 B 中再现在 canvas 类 A 中用鼠标绘制的绘图(带有垂直线的示例)。

为此,我需要将鼠标坐标从一个类转移到另一个类,但我不知道该怎么做。 如果您有任何想法,谢谢。 PS:我给 x 放了一个固定值来解释我想做什么

from tkinter import*

def main():
    display()

def display():
   
    fen=Tk()
    fen.title("Test")
    fen.geometry("500x200+50+50")
    fen.configure(bg='green')   
    
    a = A(fen)
    a.configure(bg='white', bd=2, relief=SUNKEN)
    a.grid(row=1,column=1)    
    
    b = B(fen)        
    b.configure(bg="White", bd=2, relief=SUNKEN)
    b.grid(row=2, column=1)    
    
class A(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
        self.bind('<Motion>', self.callback)         
        
    def callback(self, event):        
        x, y = event.x, event.y         
        self.create_line(x, 0, x, 100, width=1)        
        
class B(Canvas):
    def __init__(self, fen, larg = 500, haut=100,  x=" "):
        Canvas.__init__(self, fen)
        self.configure(width=larg, height=haut)
        self.larg, self.haut = larg, haut
        
        x = 200 # variable to import from class A ??
        
        self.create_line(x, 0, x, 100, width=1)   
   
main()
python 对象 mouse tkinter-canvas

评论

0赞 Michael Butscher 10/30/2023
您可能希望在类的实例之间共享它。这意味着实例(中的变量名)需要引用 。如果得到一个方法,则可以调用它来传输坐标。adisplaybbcallbacka.callback

答:

0赞 Pablo Marco Rider 10/30/2023 #1

当然还有其他方法可以做到这一点,但一种可能的方法是创建你自己的继承自 Tk 的类,并使用它,以便 A 可以传播其事件,以便它们可以由父级分发,在这种情况下,镜像 B 上的事件。

粗略的示例实现可以是:

from tkinter import *

def main():
    Display()

    
class Display(Tk):
    def __init__(self):
        super().__init__()
        self.title("Test")
        self.geometry("500x200+50+50")
        self.configure(bg='green')   
        
        self.a = A(self)
        self.a.configure(bg='white', bd=2, relief=SUNKEN)
        self.a.grid(row=1,column=1)    
        
        self.b = B(self)        
        self.b.configure(bg="White", bd=2, relief=SUNKEN)
        self.b.grid(row=2, column=1)    
        
        self.mainloop()
        
    def callback_from_a(self, x, y):
        self.b.create_line(x, 0, x, 100, width=1)
        
    
class A(Canvas):
    def __init__(self, fen , larg=500, haut=100):
        self.parent = fen
        Canvas.__init__(self, fen)
        self.configure(width=larg, height=haut)
        self.larg, self.haut = larg, haut
        self.bind('<Motion>', self.callback)         
        
    def callback(self, event):        
        x, y = event.x, event.y         
        self.create_line(x, 0, x, 100, width=1)  
        self.parent.callback_from_a(x, y)
        
        
class B(Canvas):
    def __init__(self, fen, larg = 500, haut=100,  x=" "):
        Canvas.__init__(self, fen)
        self.configure(width=larg, height=haut)
        self.larg, self.haut = larg, haut
        
        x = 200 # variable to import from class A ??
        
        #self.create_line(x, 0, x, 100, width=1)   
   
main()

评论

0赞 Jean-Michel Grilly 10/30/2023
非常感谢,我没有想到这一点。它有效!只是想用其他方式吗?
0赞 Pablo Marco Rider 10/30/2023
您可以让 A 知道 B(保持对它的引用)并直接传播事件。我不太喜欢这种方法,因为我认为 canvas 不应该意识到彼此的存在。