Figure-Objekt in Qt Interface anzeigen lassen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Hi,

Da ich schon seit mehr als einem Tag an einem ungelösten Problem sitze, dachte ich, es wäre mal wieder Zeit mich ans Forum zu wenden. Ich möchte ein Figure-Objekt in meiner GUI verwendenden. Ich verwende den Qt Designer. Die Funktion (die auch funktioniert), die das Figure-Objekt erzeugt lautet:

Code: Alles auswählen

#file name: plots.py
#Es werden einfach die Koordinaten der Daten eingegeben (x,y,z) und der Plot wird erzeugt.
def color_plot(x,y,z,x_label="x",y_label="y",z_label="z"):  
    f=Figure()
    a=f.add_subplot(111)
    x_color=a.pcolormesh(x,y,z.T)
    f.colorbar(x_color,orientation="vertical",label=z_label)
    a.set_xlabel(x_label)
    a.set_ylabel(y_label)
    return f
Wie kann ich das in ein MplWidget integrieren. Mein Ansatz war:

Code: Alles auswählen

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import plots

def main():
    
    application = QApplication(sys.argv)
    frame = loadUi('inter.ui')
    
    def load_data():            
        
        x=[....some_data....]
        y=[.....]
        z=[....]     
        f=plots.color_plot(x,y,z)
        #Das hier war meine Idee, die allerdings nicht funktioniert. Es wird zwar keine Fehlermeldung angezeigt, allerdings gibt es kein Output
        f=plots.color_plot(x,y,z1)
        mw=frame.mplwidget
        mw.fig=f
        mw.draw()
        
    frame.pushButton_2.clicked.connect(load_data)
    frame.show()
    sys.exit(application.exec_())
 
if __name__ == '__main__':
    main()
Kann mir jemand erklären, wie man diese mplwidgets verwendet?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

In meiner Anwendung stelle ich Matplotlib-Plots auf QDockWidgets dar. Hierzu habe ich meinen eigenen FigureManager von backend_qt4.FigureManagerQT abgeleitet und FigureManagerQT mit dem eigenen FigureManager ersetzt. In der __init__ Methode bekommt der FigureManager ein canvas Objekt. Dieses canvas Objekt ist ein QWidget, das den Plot darstellt und eine Referenz auf das figure Objekt hat. Dieses canvas Objekt kannst Du in Deine eigenen Anwendungen einbauen. Das ganze habe ich mir beim Vorgänger von Spyder abgeguckt.

Hier findest Du ein Beispiel mit einer anderen Vorgehensweise:
http://matplotlib.org/examples/user_int ... n_qt4.html
a fool with a tool is still a fool, www.magben.de, YouTube
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

MagBen hat geschrieben:In meiner Anwendung stelle ich Matplotlib-Plots auf QDockWidgets dar. Hierzu habe ich meinen eigenen FigureManager von backend_qt4.FigureManagerQT abgeleitet und FigureManagerQT mit dem eigenen FigureManager ersetzt. In der __init__ Methode bekommt der FigureManager ein canvas Objekt. Dieses canvas Objekt ist ein QWidget, das den Plot darstellt und eine Referenz auf das figure Objekt hat. Dieses canvas Objekt kannst Du in Deine eigenen Anwendungen einbauen. Das ganze habe ich mir beim Vorgänger von Spyder abgeguckt.

Hier findest Du ein Beispiel mit einer anderen Vorgehensweise:
http://matplotlib.org/examples/user_int ... n_qt4.html
Da ist auch schon das Problem. Ich check den ganzen Kram mit den Widget-Klassen einfach nicht, weswegen ich auch froh bin den Qt Designer benutzen zu können. Der Designer erzeugt mir ja schon ein Objekt mit dem Namen mplwidget aus der MplWidget-Klasse. Ich verstehe einfach nicht, wie das alles zusammen hängt und wie ich darauf zu greifen kann.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Versuch mal ob's damit geht (Zeile 23):

Code: Alles auswählen

mw.figure=f
a fool with a tool is still a fool, www.magben.de, YouTube
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Dann bekomme ich die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/x/Desktop/gui_tests/gui2.py", line 29, in load_data
    mw.draw()
  File "C:\Python27\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 154, in draw
    FigureCanvasAgg.draw(self)
  File "C:\Python27\lib\site-packages\matplotlib\backends\backend_agg.py", line 451, in draw
    self.figure.draw(self.renderer)
  File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\figure.py", line 1034, in draw
    func(*args)
  File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 2016, in draw
    if self.figure.canvas.is_saving():
AttributeError: 'NoneType' object has no attribute 'is_saving'
Die Zeilenangaben stimmen nicht mit den geposteten Code überein, weil ich nur einen Ausschnitt kopiert habe.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

dann probier das:

Code: Alles auswählen

mw.figure=f
f.canvas = mw
a fool with a tool is still a fool, www.magben.de, YouTube
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Dann kommt zwar keine Fehlermeldung aber es wird nichts im Canvas angezeigt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Dann weiß ich auch nicht weiter und kann Dir nur meinen ersten Post empfehlen.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Hier habe ich eben ein kleines Beispiel gefunden (kleiner als in den Matplotlib Beispielen):
http://mrleeh.square7.ch/?p=974
Wobei ich die Namensgebung der Methode draw() etwas irreführend finde, draw() das klingt wie eine Methode, die von QWidget überschrieben wird (ist es aber nicht).
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten