我正在制作一个交互式的pyplot图表,并使用“fig.canvas.mpl_connect(event,function)”来响应按键或鼠标操作。它可以正常工作。但是,为了方便导入,我需要将函数压缩成一个类。mpl_connect函数将在类的__init__函数中调用。但是这会导致它无法工作。只有当mpl_connect在类外部与类内部的函数相关联时,它才能正常工作。
当然,我已经尝试过不使用类进行调用,这也可以正常工作。并且为了证明问题出现在类的__init__函数中,我在类外部以类内部函数的引用调用了mpl_connect。
下面是一个简化版的示例代码,它是一个简单的事件处理程序,当您用鼠标单击pyplot图表时,它会在控制台上打印“yes”:
-> 没有使用类可以正常工作!但在其他程序中导入时不可靠。
当然,我已经尝试过不使用类进行调用,这也可以正常工作。并且为了证明问题出现在类的__init__函数中,我在类外部以类内部函数的引用调用了mpl_connect。
下面是一个简化版的示例代码,它是一个简单的事件处理程序,当您用鼠标单击pyplot图表时,它会在控制台上打印“yes”:
-> 没有使用类可以正常工作!但在其他程序中导入时不可靠。
import matplotlib.pyplot as plt
def abc(event):
print("yes")
fig, ax = plt.subplots()
fig.canvas.mpl_connect("button_press_event",abc)
plt.show()
->无法工作,不会打印“yes”(即使使用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()
->能够工作,现在有一个存储函数的类,但应该使用对该类的引用,并且它看起来不太好:
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()
当我在类的初始化期间调用mpl_connect函数时,我希望它在我点击图表时打印出“是”,这是正常、逻辑的Python方式。我认为这是一个bug。谢谢。
编辑,通过添加弱引用已修复。
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()
test()
实例的引用。抱歉,我没有注意到。可以使用mytest = test()
或类似的方式来解决。 - ImportanceOfBeingErnest