Python 调用另一个类的方法时,该方法不能完全工作

Python 调用另一个类的方法时,该方法不能完全工作,python,matplotlib,pyqt,Python,Matplotlib,Pyqt,我有以下代码: class Matplotlib_figure(QMainWindow): minimumCoords = None maximumCoords = None initial_marker = None final_marker = None limite = None def __init__(self): #A lot of stuff to draw a matplotlib figure def minimumLimit(self)

我有以下代码:

class Matplotlib_figure(QMainWindow):
  minimumCoords = None
  maximumCoords = None
  initial_marker = None
  final_marker = None
  limite = None

  def __init__(self):
    #A lot of stuff to draw a matplotlib figure

  def minimumLimit(self):
    self.cMinL = self.figure_canvas.mpl_connect("button_press_event", self.select_minimumLimit)
    self.limite = "minimum"

  def select_minimumLimit(self, event):
    if event.button == 1:
        self.clearMarker()  #This is another method that i call

        Matplotlib_figure.minimumCoords = None
        Matplotlib_figure.minimumCoords = event.xdata

        if Matplotlib_figure.minimumCoords <= Matplotlib_figure.maximumCoords or Matplotlib_figure.maximumCoords == None:

            marker = self.axes.axvline(event.xdata,0,1, linestyle='dashed',
                linewidth = 2, color = "green" )    
            self.figure_canvas.draw_idle()
            Matplotlib_figure.initial_marker = marker


class Data(QDialog):
  minimum = None
  maximum = None

  def __init__(self, parent):
    QDialog.__init__(self, None, QWindowsStayOnTopHint)
    uic.loadUi("", self)

  def show_lines(self):
    SelectData.minimo = self.lineEdit.text()
    SelectData.maximo = self.lineEdit_2.text()

    Matplotlib_figure.minimumCoords = float(SelectData.minimo)
    Matplotlib_figure.maximumCoords = float(SelectData.maximo)

  #Here is where i want to call a method in the Matplotlib_figure class
    view = Matplotlib_figure()
    view.minimumLimit()
    view.maximumLimit()
类Matplotlib_图(QMainWindow):
最小坐标=无
maximumCoords=无
初始标记=无
最终标记=无
限制=无
定义初始化(自):
#绘制matplotlib图形需要很多东西
def最小限值(自身):
self.cMinL=self.figure\u canvas.mpl\u connect(“按钮按下事件”,self.select\u最小限制)
self.limite=“最小值”
def select_minimumLimit(自身、事件):
如果event.button==1:
self.clearMarker()#这是我调用的另一个方法
Matplotlib_figure.minimumCoords=无
Matplotlib_figure.minimumCoords=event.xdata

如果Matplotlib_figure.minimumCoords我认为关键问题来自以下注释:

画布只保留对回调的弱引用。因此,如果回调是类实例的方法,则需要保留对该实例的引用。否则实例将被垃圾收集,回调将消失

因此,您在
show_lines
方法中创建了一个新的
视图
,但这是一个局部变量。当函数返回时,变量超出范围,python可能会尝试删除它。通常,如果关闭保存对某个方法的引用,则该方法将保留其作为方法的对象,这不会发生,但因为
mpl\u connect
只对函数进行弱引用,因此不会保留
视图
,因此当
显示行
返回时,该方法也会丢失,因此回调将恢复为不做任何操作

您可能可以通过重写
show_line
以保存视图来解决此问题,例如:

def show_lines(self):
    SelectData.minimo = self.lineEdit.text()
    SelectData.maximo = self.lineEdit_2.text()

    Matplotlib_figure.minimumCoords = float(SelectData.minimo)
    Matplotlib_figure.maximumCoords = float(SelectData.maximo)

    #Here is where i want to call a method in the Matplotlib_figure class
    self.view = Matplotlib_figure()
    self.view.minimumLimit()
    self.view.maximumLimit()
现在,
Matplotlib\u图
实例将被保留,只要
数据
实例被保存

[基于问题错误的先前回答保留在下面]

我不太了解QT框架或matplotlib API,但在我看来,您已经创建了一个
ViewWidget
的实例,它是一个与
matplotlib\u figure
完全不同的类(如果我认识到,它是QT
QMainWindow
类的子类,它是一个完全不同的python模块)。因此,我希望当您调用
minimumLimit()
时,您会得到一个
AttributeError
异常,而我不希望它调用您的方法。如果需要,您必须创建一个实例并调用:

view = Matplotlib_figure()
view.minimumLimit()
view.maximumLimit()

如果没有更多关于
ViewWidget
来源的上下文,很难理解您认为这应该如何工作。创建一个
matplotlib
图也有点奇怪,它是不相关的
QMainWindow
类的子类。你想用这个达到什么目的?您能为代码提供更多的上下文吗?

对不起,“ViewWidget”是一个输入错误。我已经编辑过了。我需要做的是将我的
Data
类连接到`Matplotlib\u figure
类中的
minimumLimit
方法。但是,当我尝试这样做时,我无法使
mpl_connect`触发。您是否尝试了我的建议/使其生效?我很确定问题出在弱引用上,没有保存
视图。是的,我尝试了你的建议,效果很好,很抱歉之前没有接受你的答案。那些天我去旅行了,但我忘了去。非常感谢你帮助我,也谢谢你提醒我。