mpl widget/button aus navigationstoolbar löschen?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

hallo zusammen

wie kann man einzelne buttons einer navigationstoolbox, welches mit einem mpl widget angezeigt wird, löschen?

ist das überhaupt möglich?

Mein Code:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
# Numpy functions for image creation
import numpy as np
# Matplotlib Figure object
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar

Code: Alles auswählen

class Form_TshTDlg(QDialog):
    
    def __init__(self, T_SI_opt, s_SI_opt,h_SI_opt, ORC_data_opt, Heatsource_opt, Heatsink_opt, parent = None):
        
        super(Form_TshTDlg, self).__init__(parent)        
        
        # set window title
        self.setWindowTitle("T-s and h-T Diagram")
        # instantiate a widget, it will be the main one
        self.main_widget = QWidget(self)
        # create a push Button
        self.okButton = QPushButton("OK",self)
        # create a vertical box layout widget
        vbl = QVBoxLayout(self.main_widget)
        # instantiate our Matplotlib canvas widget
        qmc = Qt4MplCanvas_TshTDlg(T_SI_opt, s_SI_opt,h_SI_opt, ORC_data_opt, Heatsource_opt, Heatsink_opt, self.main_widget) #kopplung widget und erzeugtes figure in anderer klasse
        
        # instantiate the navigation toolbar
        ntb = NavigationToolbar(qmc, self.main_widget)
        
        # pack these widget into the vertical box
        vbl.addWidget(qmc)
        vbl.addWidget(ntb)
        vbl.addWidget(self.okButton)
        self.setLayout(vbl)
        self.main_widget.setFocus()
        
        self.connect(self.okButton, SIGNAL("clicked()"), self.accept)
        
        
class Qt4MplCanvas_TshTDlg(FigureCanvas):
    """Class to represent the FigureCanvas widget"""
    def __init__(self, T_SI_opt, s_SI_opt, h_SI_opt, ORC_data_opt, Heatsource_opt, Heatsink_opt, parent): 
        
        #plot definition
        self.fig = Figure()
        
        ...
        # initialization of the canvas
        FigureCanvas.__init__(self, self.fig)
        # set the parent widget
        self.fig.subplots_adjust(hspace=0.4)
        
        self.setParent(parent)
        # we define the widget as expandable
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding,QSizePolicy.Expanding)
        # notify the system of updated policy
        FigureCanvas.updateGeometry(self)
        
        
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

malikno hat geschrieben: wie kann man einzelne buttons einer navigationstoolbox, welches mit einem mpl widget angezeigt wird, löschen?
mpl = Matplotlib? Solche nicht trivialen Infos solltest Du ruhig ausschreiben ;-)

Handelt es sich um native Widgets von Qt? Mir sagen diese Namen nämlich nix. Wenn es sich aber um spezielle Widgest von Matplotlib handelt, ist die dortige Doku Dein Anlaufpunkt.

Aus Deinem spärlich kommentierten Code sehe ich auch nicht die Stelle, an welcher Du das Löschen versuchst / haben möchtest. Da solltest Du nicht unmotiviert Code hier reinpasten, sondern entweder ein lauffähiges Minimalbeispiel, oder relevante Codestellen, die Du dann noch im Text erläuterst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

Sorry. Das war ein wenig schlampig. Stimmt.

Also mein Code zeigt eigentlich nur wie ich eine "Form" öffne. Diese enthält ein Matplotlib Widget, einen ok Button und eben eine Navigationstoolbox. Die Navigationstoolbox besteht dabei aus verschiedene Buttons, wie zum Beispiel zoom, save, usw. Fast alle dieser Funktionen (zoom, ...) funktioniert einwandfrei. Lediglich ein Button funktioniert bei mir leider nicht. Da ich diesen nicht wirklich brauche, möchte ich ihn einfach aus der standard Navigationstoolbox entfernen. Nun würde ich eine Lösung für dieses Problem suchen. Ich habe hierzu schon einen Beitrag in google gefunden.
http://old.nabble.com/Navigation-toolba ... 47977.html
Dieser ist jedoch auf wx Python basierend. Ich hätte das gleiche in PyQt probiert, und dies hat leider nicht funktioniert.

Vielleicht hat jemand von euch das schon mal gebraucht.

lg
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dann bau doch mal eine minimales lauffähiges Beispiel zusammen und zeige uns darin Deinen Versuch. Zusätzlich gib uns doch mal einen Link auf die Doku zu dieser Klasse.

Bei "QWidget"-Subklassen kann man eigentlich immer per `setEnabled(False)` das ganze Widget deaktivieren. Man muss halt nur Zugriff auf den speziellen Button haben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

Also hier mal ein einfaches Beispiel. Wenn man dieses Programm ausführt, erhält man ein Dialogfenster, in welchem ein subplot ersichtlich ist. Weiters ist eine Naviagationstoolbox vorhanden, welche verschiedene Funktionen bereitstellt. Bei mir funktioniert nur "einer" dieser Buttons in der Navigationstoolbox leider nicht. Daher würde ich gerne, wenn möglich, die gesamte Toolbox drinnen lassen, jedoch nur den einen Button von der Toolbox entfernen.

Hoffe ihr versteht mich. Ansonsten kann ich noch genauer werden.

Vielen dank schon mal für eure bisherigen Mühen.

Code: Alles auswählen

import sys
# Python Qt4 bindings for GUI objects                                                                                                                                            
from PyQt4 import QtGui
# Numpy functions for image creation                                                                                                                                             
import numpy as np
# Matplotlib Figure object                                                                                                                                                       
from matplotlib.figure import Figure  
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar


class Form_TshTDlg(QDialog):
    
    def __init__(self,  parent = None):
        
        super(Form_TshTDlg, self).__init__(parent)        
        
        # set window title
        self.setWindowTitle("T-s and h-T Diagram")
        # instantiate a widget, it will be the main one
        self.main_widget = QWidget(self)
        # create a push Button
        self.okButton = QPushButton("OK",self)
        # create a vertical box layout widget
        vbl = QVBoxLayout(self.main_widget)
        # instantiate our Matplotlib canvas widget
        qmc = Qt4MplCanvas_TshTDlg(self.main_widget) #kopplung widget und erzeugtes figure in anderer klasse
        # instantiate the navigation toolbar
        
        ntb = NavigationToolbar(qmc, self.main_widget)
        
        # pack these widget into the vertical box
        vbl.addWidget(qmc)
        vbl.addWidget(ntb)
        vbl.addWidget(self.okButton)
        self.setLayout(vbl)
        self.main_widget.setFocus()
        
        self.connect(self.okButton, SIGNAL("clicked()"), self.accept)
        
        
class Qt4MplCanvas_TshTDlg(FigureCanvas):
    """Class to represent the FigureCanvas widget"""
    def __init__(self, T_SI_opt, s_SI_opt, h_SI_opt, ORC_data_opt, Heatsource_opt, Heatsink_opt, parent): 
        
        #plot definition
        self.fig = Figure()
        
   

        self.axes = self.fig.add_subplot(211)
        t = np.arange(0.0, 3.0, 0.01)
        s = np.cos(2*np.pi*t)
        self.axes.plot(t, s)
        
        #self.fig2 = Figure()
        self.axes2 = self.fig.add_subplot(212)
        t = np.arange(0.0, 3.0, 0.01)
        s = np.cos(2*np.pi*t)
        self.axes2.plot(t, s)
        
        # initialization of the canvas
        FigureCanvas.__init__(self, fig)
        #set the parent widget
        self.setParent(parent)
        # we define the widget as expandable
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding,QSizePolicy.Expanding)
        # notify the system of updated policy
        FigureCanvas.updateGeometry(self)
        
        
        
# create the GUI application
qApp = QtGui.QApplication(sys.argv)
# instantiate the ApplicationWindow widget
aw = ApplicationWindow()
# show the widget
aw.show()
# start the Qt main loop execution, exiting from this script
# with the same return code of Qt application
sys.exit(qApp.exec_())
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Hallo,

Ich hatte mal ein ähnliches Problem. Du musst von NavigationToolbar ableiten und _init_toolbar überschreiben. Dort kannst du dann nach belieben neue Buttons hinzufügen bzw. weglassen. Hier mal ein Beispiel von mir (In dem ich allerdings die Icons durch eigene ersetzt habe und einen Button entfernt habe ...):

Code: Alles auswählen

from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT
from matplotlib.backend_bases import cursors as mplCursors

class MyMplToolbar(NavigationToolbar2QT):  
    def __init__(self, *args, **kwargs):
        NavigationToolbar2QT.__init__(*args, **kwargs)
  
  
    def _init_toolbar(self):
        self.basedir = os.path.join(mpl.rcParams[ 'datapath' ], 'images')
  
        a = self.addAction(QtGui.QIcon(':/images/icons/home.svg'), \
                           'Home', self.home)
        a.setToolTip('Reset original view')
        a = self.addAction(QtGui.QIcon(':/images/icons/previous.svg'), \
                           'Back', self.back)
        a.setToolTip('Back to previous view')
        a = self.addAction(QtGui.QIcon(':/images/icons/next.svg'), \
                           'Forward', self.forward)
        a.setToolTip('Forward to next view')
        self.addSeparator()
        a = self.addAction(QtGui.QIcon(':/images/icons/move.png'), \
                           'Pan', self.pan)
        a.setToolTip('Pan axes with left mouse, zoom with right')
        a = self.addAction(QtGui.QIcon(':/images/icons/zoom.png'), \
                           'Zoom', self.zoom)
        a.setToolTip('Zoom to rectangle')
        self.addSeparator()
        a = self.addAction(QtGui.QIcon(':/images/icons/saveImage.svg'), \
                           'Save', self.save_figure)
        a.setToolTip('Save the figure')
  
        self.buttons = {}
  
        # Add the x,y location widget at the right side of the toolbar
        # The stretch factor is 1 which means any resizing of the toolbar
        # will resize this label instead of the buttons.
        if self.coordinates:
            self.locLabel = QtGui.QLabel("", self)
            self.locLabel.setAlignment(
                    QtCore.Qt.AlignRight | QtCore.Qt.AlignTop)
            self.locLabel.setSizePolicy(
                QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                  QtGui.QSizePolicy.Ignored))
            labelAction = self.addWidget(self.locLabel)
            labelAction.setVisible(True)
  
        # reference holder for subplots_adjust window
        self.adj_window = None
        
    def mouse_move(self, event):
        if not event.inaxes or not self._active:
            if self._lastCursor != mplCursors.POINTER:
                self.set_cursor(mplCursors.POINTER)
                self._lastCursor = mplCursors.POINTER
        else:
            if self._active == 'ZOOM':
                if self._lastCursor != mplCursors.SELECT_REGION:
                    self.set_cursor(mplCursors.SELECT_REGION)
                    self._lastCursor = mplCursors.SELECT_REGION
                if self._xypress:
                    x, y = event.x, event.y
                    lastx, lasty, _, _, _, _ = self._xypress[0]
                    self.draw_rubberband(event, x, y, lastx, lasty)
            elif (self._active == 'PAN' and
                  self._lastCursor != mplCursors.MOVE):
                self.set_cursor(mplCursors.MOVE)
  
                self._lastCursor = mplCursors.MOVE
  
        if event.inaxes and event.inaxes.get_navigate():
  
            try: s = event.inaxes.format_coord(event.xdata, event.ydata)
            except ValueError: pass
            except OverflowError: pass
            else:
                if len(self.mode):
                    self.set_message('%s : %s' % (self.mode, s))
                else:
                    self.set_message(s)
        else: self.set_message(self.mode)
Ich würde dir eigentlich lieber die Seite zeigen, wo ich gefunden habe wie das geht, kann sie aber nicht mehr finden. Vielleicht guck' ich nachher nochmal.

EDIT: Beispiel wiedergefunden!
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

danke, sehr hilfreich
Antworten