QT und matplotlib Fenster

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
lexa
User
Beiträge: 2
Registriert: Donnerstag 25. August 2011, 08:11

Hallo,

ich habe ein Problem mit der QT Oberfläche zusammen mit matplotlib und kriege es leider alleine nicht auf die Reihe. Ich hoffe einer von euch kann mir einen Tipp geben. Zum Problem:
Ich habe eine Oberfläche (Programm starte ich aus der Windows Kommandozeile > python prog.py), in der ich Daten und alles Mögliche eingeben kann. Wenn ich nun einen Button klicke wird ein weiteres Skript gestartet, das die eingegeben Daten nutzt und damit eine Berechnung macht. Nun werden die berechneten Werte mit matplotlib geplottet. Der Plot wird extern geöffnet, also ohne neue QT Oberfläche oder so. Einfach im Skript über plt.show().
Das neue Fenster geht auch auf, wenn ich das Plotfenster nun schließe und auch die QT Oberfläche dann komme ich nicht wieder in die Windows Kommandozeile zurück-- diese hängt sich irgendwie auf. Ich habe schon versucht den Plot in einen eigenen Thread zu packen, das macht aber keinen Unterschied.

Kann mir jemand einen Tipp geben, wie ich es hinbekommen kann, dass mir die Kommandozeile nicht abschmiert???

(Ich will ungern den Plot direkt in die GUI einbauen, das wäre nur die Notlösung (obwohl ich nicht weiß, ob ich das hin kriegen würde). Es soll eigentlich nur der normale Plot aufgehen)

Ich danke euch schon mal für eure Hilfe :-)

Gruß Lexa
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Könntest du deinen Code posten?
gtardini
User
Beiträge: 3
Registriert: Dienstag 13. Dezember 2011, 14:15

Wenn ich lexa's Problem richtig verstanden habe, habe ich das gleiche Problem. Wenn ich plt.ion() benutze, dann bleibt das GUI zwar aktiv, aber die Plotfenstern sind "gefroren". Wenn ich plt.show() benutze, dann bleiben die Plotfenster sichtbar, dafuer ist das GUI unbrauchbar, bis ich die einzelnen Fenster zumache. Hier der Code fuer beide Faelle:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore
import sys
import matplotlib.pylab as plt

class qtplt(QtGui.QMainWindow):

  def __init__(self):

    QtGui.QMainWindow.__init__(self)

    exitAction = QtGui.QAction('Exit', self)
    exitAction.triggered.connect(QtGui.qApp.quit)
    runAction = QtGui.QAction('Run', self)
    runAction.triggered.connect(self.myplot1)
#    runAction.triggered.connect(self.myplot2)
    self.toolbar = self.addToolBar('Tools')
    self.toolbar.addAction(exitAction)
    self.toolbar.addAction(runAction)

  def myplot1(self):

    plt.figure(1,figsize=(6, 4))
    plt.clf()
    plt.title('Plot1',fontsize=10)
    plt.ion()
    plt.plot([0,1],[0,1],color="#900000")
    plt.draw()
    plt.figure(2,figsize=(6, 4))
    plt.clf()
    plt.title('Plot2',fontsize=10)
    plt.plot([0,1],[0,0.5],color="#009000")
    plt.draw()

  def myplot2(self):

    plt.figure(1,figsize=(6, 4))
    plt.clf()
    plt.title('Plot1',fontsize=10)
    plt.plot([0,1],[0,1],color="#900000")
    plt.draw()
    plt.figure(2,figsize=(6, 4))
    plt.clf()
    plt.title('Plot2',fontsize=10)
    plt.plot([0,1],[0,0.5],color="#009000")
    plt.draw()
    plt.show()

app = QtGui.QApplication(sys.argv)
run = qtplt()
run.setGeometry(300, 300, 150, 150)
run.show()
app.exec_()
Vielen Dank!
Giovanni
gtardini
User
Beiträge: 3
Registriert: Dienstag 13. Dezember 2011, 14:15

Ein Kollege hat mein Problem geloest: es ist offensichtlich das falsche Backend, das automatisch benutzt wurde. Je nach Installation, kann eine zusaetzliche Zeile "matplotlib.use('Qt4Agg')" vor dem "import matplotlib.pylab" noetig sein.
Der funktionierende Code lautet bei mir:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore 
import sys
import matplotlib
matplotlib.use('Qt4Agg')
import matplotlib.pylab as plt

class qtplt(QtGui.QMainWindow):

  def __init__(self):

    QtGui.QMainWindow.__init__(self)
    exitAction = QtGui.QAction('Exit', self)
    exitAction.triggered.connect(QtGui.qApp.quit)
    runAction = QtGui.QAction('Plot', self)
    runAction.triggered.connect(self.myplot)
    self.toolbar = self.addToolBar('Tools')
    self.toolbar.addAction(exitAction)
    self.toolbar.addAction(runAction)

  def myplot(self):

    plt.ion()
    plt.figure(1,figsize=(6, 4))
    plt.clf()
    plt.title('Plot1',fontsize=10)
    plt.plot([0,1],[0,1],color="#900000")
    plt.draw()
    plt.figure(2,figsize=(6, 4))
    plt.clf()
    plt.title('Plot2',fontsize=10)
    plt.plot([0,1],[0,0.5],color="#009000")
    plt.draw()
    plt.ioff()

app = QtGui.QApplication(sys.argv)
run = qtplt()
run.setGeometry(300, 300, 150, 150)
run.show()
app.exec_()
gtardini
User
Beiträge: 3
Registriert: Dienstag 13. Dezember 2011, 14:15

Lexa, ich habe deinen Beitrag genauer gelesen: vielleicht ist dein Problem noch grundlegender. Du solltest nicht plt.show() benutzen, sonder plt.ion() vor dem ersten plt.figure Befehl, und zum Schluss plt.ioff(). plt.show() ist nicht interaktiv, somit ist es richtig, dass es den Weg zur Windows-Kommandozeile verhindert.
Antworten