2015-03-25 4 views
0

Je développe une conception de filtre à interface graphique et un outil d'analyse (https://github.com/chipmuenk/pyFDA), le sous-classement matplotlib NavigationToolbar pour mettre en œuvre des changements (ajoutés/supprimés fonctions et boutons, nouveau set d'icônes). Le code complet est disponible sous https://github.com/chipmuenk/pyFDA/. Chaque widget (tabulé) plot_ * instancie une copie de la NavigationToolbar sous-classée, par ex. de plot_widgets/plot_phi.py:Subclassing matplotlib NavigationToolbar lance erreur avec Pan/Zoom

from plot_widgets.plot_utils import MplWidget 
class PlotPhi(QtGui.QMainWindow): 

    def __init__(self, parent = None, DEBUG = False): # default parent = None -> top Window 
     super(PlotPhi, self).__init__(parent) 
     self.mplwidget = MplWidget() 
     self.mplwidget.setFocus() 
     self.setCentralWidget(self.mplwidget) 

     ax = self.mplwidget.fig.add_subplot(111) 

En général, cela fonctionne très bien, mais ...

  1. ... les fonctions "pan/zoom" et "rectangle de zoom" jeter les éléments suivants erreur (mais zoom et panoramique néanmoins). retraçage (le plus récent appel de dernier):

    File "D:\Programme\WinPython-64bit-3.4.3.1\python-3.4.3.amd64\lib\site- 
        packages\matplotlib\backends\backend_qt5.py", 
    
    line 666, in zoom 
        self._update_buttons_checked() 
    File "D:\Programme\WinPython-64bit-3.4.3.1\python-3.4.3.amd64\lib\site- 
        packages\matplotlib\backends\backend_qt5.py", 
    
    line 657, in _update_buttons_checked 
        self._actions['pan'].setChecked(self._active == 'PAN') 
    KeyError: 'pan' 
    

    Les modificateurs de souris x et y ne fonctionnent pas et il n'y a pas non plus indication visuelle si la fonction est sélectionnée ou non. Je dois avouer, je ne comprends pas très bien l'interface (QAction?) Aux fonctions combinées pan/zoom - je ne suis pas encore un pythoniste bien expérimenté.

  2. ... ma nouvelle fonction "zoom plein écran" fonctionne mais le réglage du zoom ne peut pas être annulé en utilisant "vue précédente/suivante". Cela n'est pas une grande surprise que je ne fais pas le réglage de la vue de la liste (?) Des paramètres d'affichage, ne sachant pas où commencer :-)

Qui pourrait être si bon pour me donner un peu commencer à appliquer correctement la barre d'outils de navigation?

Et (bouchon éhonté :-)): Toute personne qui veut contribuer au projet? Les prochaines étapes seront VHDL/Verilog - Exporter à l'aide myHDL (http://myhdl.org) et sauvegarder/charger la fonctionnalité de filtre

Ceci est un extrait de plot_widgets garni/plot_utils.py

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 
from matplotlib.backend_bases import cursors as mplCursors 
from matplotlib.figure import Figure 

class MyMplToolbar(NavigationToolbar): 
    """ 
    Custom Matplotlib Navigationtoolbar, subclassed from 
    NavigationToolbar. 

    derived from http://www.python-forum.de/viewtopic.php?f=24&t=26437 
    """ 

    def _init_toolbar(self): 
#  self.basedir = os.path.join(rcParams[ 'datapath' ], 'images/icons') 
     iconDir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 
      '..','images','icons', '') 
    # HOME: 
    a = self.addAction(QtGui.QIcon(iconDir + 'home.svg'), \ 
         'Home', self.home) 
    a.setToolTip('Reset original view') 
    # BACK: 
    a = self.addAction(QtGui.QIcon(iconDir + 'action-undo.svg'), \ 
         'Back', self.back) 
    a.setToolTip('Back to previous view') 

    # PAN: 
    a = self.addAction(QtGui.QIcon(iconDir + 'move.svg'), \ 
         'Pan', self.pan) 
#       'Pan', self.pan('self.move','self.pan')) # nearly works ... 
    a.setToolTip('Pan axes with left mouse button, zoom with right') 
    # ZOOM RECTANGLE: 
    a = self.addAction(QtGui.QIcon(iconDir + 'magnifying-glass.svg'), \ 
         'Zoom', self.zoom) 
    a.setToolTip('Zoom in/out to rectangle with left/right mouse button.') 
    # Full View: 
    a = self.addAction(QtGui.QIcon(iconDir + 'fullscreen-enter.svg'), \ 
     'Full View', self.parent.pltFullView) 
    a.setToolTip('Full view') 
    self.buttons = {} 

    # reference holder for subplots_adjust window 
    self.adj_window = None 

Répondre

0

Faire une ingénierie inverse avec le NavigationToolbar d'origine m'a montré quelques morceaux manquants:

# PAN: 
self.a_pa = self.addAction(QtGui.QIcon(iconDir + 'move.svg'), \ 
         'Pan', self.pan) 
self.a_pa.setToolTip('Pan axes with left mouse button, zoom with right') 
self._actions['pan'] = self.a_pa 
self.a_pa.setCheckable(True) 

self.a_pa.setEnabled(True) # enable/disable function programwise 

le code ci-dessus élimine l'erreur et donne le signal visuel (« setCheckable ») si Pan est sélectionné ou non.

La « vue plein » peut facilement être ajouté à l'histoire des limites de vue en appelant

self.myNavigationToolbar.push_current() 

avant changer la vue (par exemple par autoscale).

La solution aux modificateurs de souris manquants est tout aussi simple (quand on sait comment, qui est ...) comme indiqué dans le poste SO

matplotlib and Qt: mouse press event.key is always None

Le problème est que les événements de presse clés en général ne sont pas traitées à moins que vous "activiez le focus de qt sur votre canvas mpl". La solution consiste à ajouter deux lignes à la classe MplWidget:

self.canvas.setFocusPolicy(QtCore.Qt.ClickFocus) 
self.canvas.setFocus()