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
完全不同的类(如果我认识到,它是QTQMainWindow
类的子类,它是一个完全不同的python模块)。因此,我希望当您调用minimumLimit()
时,您会得到一个AttributeError
异常,而我不希望它调用您的方法。如果需要,您必须创建一个实例并调用:
view = Matplotlib_figure()
view.minimumLimit()
view.maximumLimit()
如果没有更多关于ViewWidget
来源的上下文,很难理解您认为这应该如何工作。创建一个matplotlib
图也有点奇怪,它是不相关的QMainWindow
类的子类。你想用这个达到什么目的?您能为代码提供更多的上下文吗?对不起,“ViewWidget”是一个输入错误。我已经编辑过了。我需要做的是将我的Data
类连接到`Matplotlib\u figure类中的minimumLimit
方法。但是,当我尝试这样做时,我无法使
mpl_connect`触发。您是否尝试了我的建议/使其生效?我很确定问题出在弱引用上,没有保存视图。是的,我尝试了你的建议,效果很好,很抱歉之前没有接受你的答案。那些天我去旅行了,但我忘了去。非常感谢你帮助我,也谢谢你提醒我。