繁体   English   中英

为什么在类的__init__中调用时mpl_connect不起作用?

[英]Why doesn't mpl_connect work when called in the __init__ of a class?

当按下按键或鼠标时,我正在制作一个带有“fig.canvas.mpl_connect(event,function)”的交互式pyplot图形。 它按预期工作。 但是,为了使其易于导入,我需要将函数压缩到类中。 mpl_connect函数将在类的__init__函数中调用。 但这使它失败了。 只有在引用类中的函数时在类外部调用mpl_connect时,它才有效。

当然,我试图在没有类的情况下调用它,这可以按预期工作。 为了表明问题发生在类的__init__函数内部,我在类中引用了类中的函数,调用了mpl_connect。

这是我试图实现的浓缩,测试版本。 它是一个简单的事件处理程序,当您用鼠标单击pyplot图形时,它会使控制台打印为“是”。

- >工作,虽然没有课! 导入其他程序时不可靠。

import matplotlib.pyplot as plt
def abc(event):
   print("yes")
fig, ax = plt.subplots()
fig.canvas.mpl_connect("button_press_event",abc)
plt.show()

- >不工作,不打印“是”(即使使用self.fig。)

import matplotlib.pyplot as plt
class test():
    def __init__(self):
        fig, ax = plt.subplots()
        fig.canvas.mpl_connect("button_press_event",self.abc)
    def abc(self, event):
        print("Yes")
test()
plt.show()

- > DOES WORK,现在有一个存储该函数的类,但是应该使用对类的引用,它看起来不太好看:

import matplotlib.pyplot as plt
class test():
    def __init__(self):
        self.FIG, ax = plt.subplots()
    def abc(self, event):
        print("Yes")  
A = test()
A.FIG.canvas.mpl_connect("button_press_event",A.abc)
plt.show()

当我在类的初始化期间(正常的,逻辑的pythonic方式)调用mpl_connect函数时单击图形时,我希望它打印“是”。 我相信这是一个错误。 谢谢。

编辑,通过添加弱引用修复。

import matplotlib.pyplot as plt
class test():
    def __init__(self):
        self.fig, ax = plt.subplots()
        self.cid_abc = self.fig.canvas.mpl_connect("button_press_event",self.abc)
    def abc(self, event):
        print("Yes")
mytest = test()
plt.show()

您需要保留对mpl_connect创建的回调标识的mpl_connect 由于CallbackRegistry文档字符串形成:

实际上,当不再需要它们时,应该始终断开所有回调以避免悬空引用(从而避免内存泄漏)。 但是,Matplotlib中的实际代码很少这样做,并且由于其设计,放置这种代码相当困难。 为了解决这个问题,并防止这类内存泄漏,我们只将弱引用存储到绑定方法,因此当目标对象需要死亡时,CallbackRegistry 将不会保持活动状态

换句话说,您需要将mpl_connect的返回值mpl_connect给实例变量,例如

self.cid = fig.canvas.mpl_connect("button_press_event", self.abc)

类似于您在事件处理指南中找到它的方式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM