Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Qt Matplotlib:来自事件的子批ID引用_Python_Events_Matplotlib_Pyqt_Subplot - Fatal编程技术网

Python 2.7 Qt Matplotlib:来自事件的子批ID引用

Python 2.7 Qt Matplotlib:来自事件的子批ID引用,python,events,matplotlib,pyqt,subplot,Python,Events,Matplotlib,Pyqt,Subplot,我的目标是确定用户点击了哪个子地块。更准确地说,在matplotlib类中,我可以使用event.inaxes识别子地块。伟大的但是我无法在Qt小部件类中获取该事件。 我肯定错过了一些东西。。。 下面是我最近一次“笨拙”尝试的代码。有关于如何处理的建议吗 我不是Python专家。必须使用Python 2.7(别无选择) 共有3类: 该连接器是一个信号/插槽QT类 ChartFigure是matplotlib类(包括所需的鼠标事件) InventoryChartsWidget是主要的小部件(Qt;

我的目标是确定用户点击了哪个子地块。更准确地说,在matplotlib类中,我可以使用event.inaxes识别子地块。伟大的但是我无法在Qt小部件类中获取该事件。 我肯定错过了一些东西。。。 下面是我最近一次“笨拙”尝试的代码。有关于如何处理的建议吗

我不是Python专家。必须使用Python 2.7(别无选择)

共有3类: 该连接器是一个信号/插槽QT类 ChartFigure是matplotlib类(包括所需的鼠标事件) InventoryChartsWidget是主要的小部件(Qt;这里我需要子批次的ID)


任何帮助都将不胜感激。多谢各位

这里有一个有效的解决方案。真正的限制是我在python中的想法(更具体地说,缺少正确声明的变量……无法使用它)

也许它能帮助某人。。。
我们当然可以争论这三门课是否有意义,但这是另一个话题

这里有一个有效的解决方案。真正的限制是我在python中的想法(更具体地说,缺少正确声明的变量……无法使用它)

也许它能帮助某人。。。
我们当然可以争论这三门课是否有意义,但这是另一个话题

以下是如何将事件传输到主类:

from __future__ import print_function
from __future__ import division

import sys

from PyQt4 import QtGui
from PyQt4 import QtCore

from matplotlib.figure import Figure
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_qt4agg import (
FigureCanvasQTAgg as FigureCanvas,
NavigationToolbar2QT as NavigationToolbar)

#Connect InventoryChartsWidget to ChartFigure: QT
class TheConnector(QtCore.QObject):

    selecteddataregion=QtCore.pyqtSignal(object, name='selecteddataregion')

    def emitsignal(self,xmin,xmax,ymin,ymax, event):
        self.selecteddataregion.emit((xmin,xmax,ymin,ymax, event))

#Chart including events: MATPLOTLIB
class ChartFigure(Figure):

    def onclick(self,event):
        #MAIN ISSUE
        #HOW TO RETURN THE subplot axes to class InventoryChartsWidget?    

        if event.button==1 :
            print('OK: Axes is ... ', event.inaxes)
            self.ConnSbPlt.emitsignal(1.0,1.0,2.0,2.0, event)


    def __init__(self,Conn):
        #Init the Matplotlib      
        Figure.__init__(self) #initialize the orginal class, see also super()
        super(ChartFigure, self).__init__()
        self.canvas=FigureCanvas(self)
        self.ConnSbPlt=Conn

#Chart including events: QT  
class InventoryChartsWidget(QtGui.QDialog):

    def __init__(self, parent=None,xlimlow=0,xlimhigh=100,ylimlow=0,ylimhigh=100, G_array=[], N_array=[], ddom_array=[], hdom_array=[], speciesDict={}):

        QtGui.QMainWindow.__init__(self, parent)

        #Fake stupid data 
        self.mG_array  = [2] * 10
        self.mHdom_array = [0.5] * 10

        #jte to make sur I have it
        self.xdata_start=-1.0

        #fake plot to get a member of type subplot: UGLY!
        #Attempt to create a member object "axes"
        self.tabFake = QtGui.QWidget()
        self.tabFake = self.create_tab(self.tabFake)
        self.tabFake.plots = []
        self.subPlotFake = self.tabFake.fig.add_subplot(111)

        print("here is OK; it exists ...", self.subPlotFake)

        self.create_main_frame()

        self.setModal(False)
        self.setVisible(True)
        self.show()


    def create_main_frame(self):
        #Associate a Qwidget with the InventoryChartsWidget widget

        print("OK here too; it exists ... ",self.subPlotFake)

        self.main_frame = QtGui.QWidget()
        LesTabs = QtGui.QTabWidget()
        self.tabG   = QtGui.QWidget()   

        #Fill the tab with Matplotlib object and draw the charts 
        self.tabG=self.create_tab(self.tabG)
        self.on_draw_G(self.tabG)
        self.tabG.fig.subplots_adjust(left=0.02,bottom=0.05,right=1,top=0.95,wspace=0.2,hspace=0.2)

        LesTabs.addTab(self.tabG,"Chart")

        grid = QtGui.QGridLayout()
        grid.addWidget(LesTabs, 0, 0)
        self.main_frame.setLayout(grid)
        self.setLayout(grid)
        self.layout().addWidget(self.main_frame)


    def UpdatePlot_DataSelection(self, transfer_object):
        #SLOT
        xmin,xmax,ymin,ymax, event = transfer_object
        print ("Axes are now in the InventoryChartsWidget: ", event.inaxes)


    def on_draw_G(self,tab):
        #Juts one subplot for test purpose
        tab.fig.clear()
        tab.plots = []
        subPlot = tab.fig.add_subplot(111)
        #subPlot.hold(False)
        tab.plots.append(subPlot)
        self.PlotData_G(subPlot,self.mG_array,self.mHdom_array)
        subPlot = tab.fig.add_subplot(122)
        #subPlot.hold(False)
        tab.plots.append(subPlot)
        self.PlotData_G(subPlot,self.mG_array,self.mHdom_array)
        tab.canvas.draw()    

    def create_tab(self,tab):    
        #Create the tab widget, associated with Matplotlib plot

        print("OK member exists ... ", self.xdata_start)
        print("OK member exists ",self.tabFake)

        #ISSUE HERE: don't understand
        #print("NOT OK !!! member does not exist Why ? ",self.subPlotFake)
        # reason: self.subPlotFake does not yet exist 

        Conn=TheConnector()
        #MATPLOTLIB
        tab.fig = ChartFigure(Conn)
        tab.canvas = FigureCanvas(tab.fig)
        tab.canvas.setParent(tab)
        tab.canvas.setFocusPolicy(QtCore.Qt.StrongFocus)
        tab.canvas.setFocus()

        #connect signal to slot 
        Conn.selecteddataregion.connect(self.UpdatePlot_DataSelection)

        tab.mpl_toolbar = NavigationToolbar(tab.canvas, tab)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(tab.canvas)  
        vbox.addWidget(tab.mpl_toolbar)
        tab.setLayout(vbox)  

        tab.canvas.mpl_connect('button_press_event', tab.fig.onclick)

        return tab    

    def on_key_press(self, event):
        #Keyboard input: standard mpl key press
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    def PlotData_G(self, plot, G_array, hdom_array):
        # Plot G
        #plot.hold(False) #axes.hold is deprecated.
        plot.scatter(x=hdom_array, y=G_array, marker='+',linewidths=1.5)
        plot.set_autoscaley_on(True)
        plot.tick_params(labelsize=8)

def main():
    app = QtGui.QApplication(sys.argv)
    form = InventoryChartsWidget(xlimlow=0,xlimhigh=60,ylimlow=0,ylimhigh=80)
    form.show()
    app.exec_()

if __name__ == "__main__":
    main()

以下是如何将事件传输到主类:

from __future__ import print_function
from __future__ import division

import sys

from PyQt4 import QtGui
from PyQt4 import QtCore

from matplotlib.figure import Figure
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_qt4agg import (
FigureCanvasQTAgg as FigureCanvas,
NavigationToolbar2QT as NavigationToolbar)

#Connect InventoryChartsWidget to ChartFigure: QT
class TheConnector(QtCore.QObject):

    selecteddataregion=QtCore.pyqtSignal(object, name='selecteddataregion')

    def emitsignal(self,xmin,xmax,ymin,ymax, event):
        self.selecteddataregion.emit((xmin,xmax,ymin,ymax, event))

#Chart including events: MATPLOTLIB
class ChartFigure(Figure):

    def onclick(self,event):
        #MAIN ISSUE
        #HOW TO RETURN THE subplot axes to class InventoryChartsWidget?    

        if event.button==1 :
            print('OK: Axes is ... ', event.inaxes)
            self.ConnSbPlt.emitsignal(1.0,1.0,2.0,2.0, event)


    def __init__(self,Conn):
        #Init the Matplotlib      
        Figure.__init__(self) #initialize the orginal class, see also super()
        super(ChartFigure, self).__init__()
        self.canvas=FigureCanvas(self)
        self.ConnSbPlt=Conn

#Chart including events: QT  
class InventoryChartsWidget(QtGui.QDialog):

    def __init__(self, parent=None,xlimlow=0,xlimhigh=100,ylimlow=0,ylimhigh=100, G_array=[], N_array=[], ddom_array=[], hdom_array=[], speciesDict={}):

        QtGui.QMainWindow.__init__(self, parent)

        #Fake stupid data 
        self.mG_array  = [2] * 10
        self.mHdom_array = [0.5] * 10

        #jte to make sur I have it
        self.xdata_start=-1.0

        #fake plot to get a member of type subplot: UGLY!
        #Attempt to create a member object "axes"
        self.tabFake = QtGui.QWidget()
        self.tabFake = self.create_tab(self.tabFake)
        self.tabFake.plots = []
        self.subPlotFake = self.tabFake.fig.add_subplot(111)

        print("here is OK; it exists ...", self.subPlotFake)

        self.create_main_frame()

        self.setModal(False)
        self.setVisible(True)
        self.show()


    def create_main_frame(self):
        #Associate a Qwidget with the InventoryChartsWidget widget

        print("OK here too; it exists ... ",self.subPlotFake)

        self.main_frame = QtGui.QWidget()
        LesTabs = QtGui.QTabWidget()
        self.tabG   = QtGui.QWidget()   

        #Fill the tab with Matplotlib object and draw the charts 
        self.tabG=self.create_tab(self.tabG)
        self.on_draw_G(self.tabG)
        self.tabG.fig.subplots_adjust(left=0.02,bottom=0.05,right=1,top=0.95,wspace=0.2,hspace=0.2)

        LesTabs.addTab(self.tabG,"Chart")

        grid = QtGui.QGridLayout()
        grid.addWidget(LesTabs, 0, 0)
        self.main_frame.setLayout(grid)
        self.setLayout(grid)
        self.layout().addWidget(self.main_frame)


    def UpdatePlot_DataSelection(self, transfer_object):
        #SLOT
        xmin,xmax,ymin,ymax, event = transfer_object
        print ("Axes are now in the InventoryChartsWidget: ", event.inaxes)


    def on_draw_G(self,tab):
        #Juts one subplot for test purpose
        tab.fig.clear()
        tab.plots = []
        subPlot = tab.fig.add_subplot(111)
        #subPlot.hold(False)
        tab.plots.append(subPlot)
        self.PlotData_G(subPlot,self.mG_array,self.mHdom_array)
        subPlot = tab.fig.add_subplot(122)
        #subPlot.hold(False)
        tab.plots.append(subPlot)
        self.PlotData_G(subPlot,self.mG_array,self.mHdom_array)
        tab.canvas.draw()    

    def create_tab(self,tab):    
        #Create the tab widget, associated with Matplotlib plot

        print("OK member exists ... ", self.xdata_start)
        print("OK member exists ",self.tabFake)

        #ISSUE HERE: don't understand
        #print("NOT OK !!! member does not exist Why ? ",self.subPlotFake)
        # reason: self.subPlotFake does not yet exist 

        Conn=TheConnector()
        #MATPLOTLIB
        tab.fig = ChartFigure(Conn)
        tab.canvas = FigureCanvas(tab.fig)
        tab.canvas.setParent(tab)
        tab.canvas.setFocusPolicy(QtCore.Qt.StrongFocus)
        tab.canvas.setFocus()

        #connect signal to slot 
        Conn.selecteddataregion.connect(self.UpdatePlot_DataSelection)

        tab.mpl_toolbar = NavigationToolbar(tab.canvas, tab)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(tab.canvas)  
        vbox.addWidget(tab.mpl_toolbar)
        tab.setLayout(vbox)  

        tab.canvas.mpl_connect('button_press_event', tab.fig.onclick)

        return tab    

    def on_key_press(self, event):
        #Keyboard input: standard mpl key press
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    def PlotData_G(self, plot, G_array, hdom_array):
        # Plot G
        #plot.hold(False) #axes.hold is deprecated.
        plot.scatter(x=hdom_array, y=G_array, marker='+',linewidths=1.5)
        plot.set_autoscaley_on(True)
        plot.tick_params(labelsize=8)

def main():
    app = QtGui.QApplication(sys.argv)
    form = InventoryChartsWidget(xlimlow=0,xlimhigh=60,ylimlow=0,ylimhigh=80)
    form.show()
    app.exec_()

if __name__ == "__main__":
    main()

“笨拙”可能是正确的词。我无法想象这样的结构会有什么意义。为了解决这段代码的问题,您最好发出一个包含matplotlib事件的信号,以便插槽能够处理它。更一般地说,我不认为拥有这三个类并在其中一个类中捕捉事件,然后将其转移到另一个类中有任何意义。感谢您对插图代码进行全新的独立查看。这当然是原始代码的一个非常简化和简短的版本,用于解释问题的本质。这三个类在当时是有意义的(至少在需求再次改变之前)。关于捕获事件并转移它,原因是保持层次结构而不是类(->结构)的纠缠。“笨拙”可能是正确的词。我无法想象这样的结构会有什么意义。为了解决这段代码的问题,您最好发出一个包含matplotlib事件的信号,以便插槽能够处理它。更一般地说,我不认为拥有这三个类并在其中一个类中捕捉事件,然后将其转移到另一个类中有任何意义。感谢您对插图代码进行全新的独立查看。这当然是原始代码的一个非常简化和简短的版本,用于解释问题的本质。这三个类在当时是有意义的(至少在需求再次改变之前)。关于捕获事件并传输它,原因是保持层次结构而不是类(->结构)的纠缠。
from __future__ import print_function
from __future__ import division

import sys

from PyQt4 import QtGui
from PyQt4 import QtCore

from matplotlib.figure import Figure
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_qt4agg import (
FigureCanvasQTAgg as FigureCanvas,
NavigationToolbar2QT as NavigationToolbar)

#Connect InventoryChartsWidget to ChartFigure: QT
class TheConnector(QtCore.QObject):

    selecteddataregion=QtCore.pyqtSignal(object, name='selecteddataregion')

    def emitsignal(self,xmin,xmax,ymin,ymax, event):
        self.selecteddataregion.emit((xmin,xmax,ymin,ymax, event))

#Chart including events: MATPLOTLIB
class ChartFigure(Figure):

    def onclick(self,event):
        #MAIN ISSUE
        #HOW TO RETURN THE subplot axes to class InventoryChartsWidget?    

        if event.button==1 :
            print('OK: Axes is ... ', event.inaxes)
            self.ConnSbPlt.emitsignal(1.0,1.0,2.0,2.0, event)


    def __init__(self,Conn):
        #Init the Matplotlib      
        Figure.__init__(self) #initialize the orginal class, see also super()
        super(ChartFigure, self).__init__()
        self.canvas=FigureCanvas(self)
        self.ConnSbPlt=Conn

#Chart including events: QT  
class InventoryChartsWidget(QtGui.QDialog):

    def __init__(self, parent=None,xlimlow=0,xlimhigh=100,ylimlow=0,ylimhigh=100, G_array=[], N_array=[], ddom_array=[], hdom_array=[], speciesDict={}):

        QtGui.QMainWindow.__init__(self, parent)

        #Fake stupid data 
        self.mG_array  = [2] * 10
        self.mHdom_array = [0.5] * 10

        #jte to make sur I have it
        self.xdata_start=-1.0

        #fake plot to get a member of type subplot: UGLY!
        #Attempt to create a member object "axes"
        self.tabFake = QtGui.QWidget()
        self.tabFake = self.create_tab(self.tabFake)
        self.tabFake.plots = []
        self.subPlotFake = self.tabFake.fig.add_subplot(111)

        print("here is OK; it exists ...", self.subPlotFake)

        self.create_main_frame()

        self.setModal(False)
        self.setVisible(True)
        self.show()


    def create_main_frame(self):
        #Associate a Qwidget with the InventoryChartsWidget widget

        print("OK here too; it exists ... ",self.subPlotFake)

        self.main_frame = QtGui.QWidget()
        LesTabs = QtGui.QTabWidget()
        self.tabG   = QtGui.QWidget()   

        #Fill the tab with Matplotlib object and draw the charts 
        self.tabG=self.create_tab(self.tabG)
        self.on_draw_G(self.tabG)
        self.tabG.fig.subplots_adjust(left=0.02,bottom=0.05,right=1,top=0.95,wspace=0.2,hspace=0.2)

        LesTabs.addTab(self.tabG,"Chart")

        grid = QtGui.QGridLayout()
        grid.addWidget(LesTabs, 0, 0)
        self.main_frame.setLayout(grid)
        self.setLayout(grid)
        self.layout().addWidget(self.main_frame)


    def UpdatePlot_DataSelection(self, transfer_object):
        #SLOT
        xmin,xmax,ymin,ymax, event = transfer_object
        print ("Axes are now in the InventoryChartsWidget: ", event.inaxes)


    def on_draw_G(self,tab):
        #Juts one subplot for test purpose
        tab.fig.clear()
        tab.plots = []
        subPlot = tab.fig.add_subplot(111)
        #subPlot.hold(False)
        tab.plots.append(subPlot)
        self.PlotData_G(subPlot,self.mG_array,self.mHdom_array)
        subPlot = tab.fig.add_subplot(122)
        #subPlot.hold(False)
        tab.plots.append(subPlot)
        self.PlotData_G(subPlot,self.mG_array,self.mHdom_array)
        tab.canvas.draw()    

    def create_tab(self,tab):    
        #Create the tab widget, associated with Matplotlib plot

        print("OK member exists ... ", self.xdata_start)
        print("OK member exists ",self.tabFake)

        #ISSUE HERE: don't understand
        #print("NOT OK !!! member does not exist Why ? ",self.subPlotFake)
        # reason: self.subPlotFake does not yet exist 

        Conn=TheConnector()
        #MATPLOTLIB
        tab.fig = ChartFigure(Conn)
        tab.canvas = FigureCanvas(tab.fig)
        tab.canvas.setParent(tab)
        tab.canvas.setFocusPolicy(QtCore.Qt.StrongFocus)
        tab.canvas.setFocus()

        #connect signal to slot 
        Conn.selecteddataregion.connect(self.UpdatePlot_DataSelection)

        tab.mpl_toolbar = NavigationToolbar(tab.canvas, tab)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(tab.canvas)  
        vbox.addWidget(tab.mpl_toolbar)
        tab.setLayout(vbox)  

        tab.canvas.mpl_connect('button_press_event', tab.fig.onclick)

        return tab    

    def on_key_press(self, event):
        #Keyboard input: standard mpl key press
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    def PlotData_G(self, plot, G_array, hdom_array):
        # Plot G
        #plot.hold(False) #axes.hold is deprecated.
        plot.scatter(x=hdom_array, y=G_array, marker='+',linewidths=1.5)
        plot.set_autoscaley_on(True)
        plot.tick_params(labelsize=8)

def main():
    app = QtGui.QApplication(sys.argv)
    form = InventoryChartsWidget(xlimlow=0,xlimhigh=60,ylimlow=0,ylimhigh=80)
    form.show()
    app.exec_()

if __name__ == "__main__":
    main()