Cursor-Position in matplotlib

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
IsQb
User
Beiträge: 1
Registriert: Montag 24. September 2012, 13:02

Guten Tag

Ich versuche mir zur Zeit im Selbststudium etwas Python und PyQt beizubringen, bisher noch mit mässigem Erfolg - hoffentlich könnt ihr mir hier etwas weiterhelfen :-)

Folgendes Problem: Ich möchte in einem Qt-Dialog ein matplot einfügen und dann die Cursorkoordinaten auslesen, wenn ich drauf klicke.

Online habe ich folgenden Code-Teil gefunden, der auch funktioniert:

Code: Alles auswählen

class Cursor:
    def __init__(self, ax):
        self.ax = ax
    def mouse_click (self, event):
        print "Click, x="+str(event.xdata)
t = arange(0.0, 1.0, 0.01)
s = sin(2*2*pi*t)
ax1 = subplot(111)
ax1.plot(t,s,'o')
cursor = Cursor(subplot(111))
connect('button_release_event', cursor.mouse_click)
show()
Das öffnet mir ein Fenster und wenn ich irgendwo hinklicke shreibt er die x-Koordinaten in die Konsole - perfekt!

Doch: Ich möchte nun den Plot in ein bestehendes Fenster integrieren. So sieht mein Versuch aus:

Code: Alles auswählen

class CursorTest3(QtGui.QDialog):
    def __init__(self, parent=None):
        super(CursorTest3, self).__init__(parent)
        self.ui=Ui_CursorTest3()
        self.ui.setupUi(self)
        t = arange(0.0, 1.0, 0.01)
        s = sin(2*2*pi*t)
        ax = self.ui.plotSingle.canvas.ax
        ax.plot(t, s, 'o')
        cursor = Cursor(ax)
        connect('button_release_event', cursor.mouse_click)
class Cursor:
    def __init__(self, ax):
        self.ax = ax
    def mouse_click (self, event):
        print "Click, x="+str(event.xdata)
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    b = CursorTest3()
    b.show()
    sys.exit(app.exec_())
Es erscheint auch ein Fenster (wobei plotSingle ein benutzerdefiniertes Widget ist, das die Zeichnung enthält). Doch wenn ich auf die Zeichnung klicke, passiert nichts (keine Ausgabe auf Konsole mehr).

Soviel ich herausgefunden habe, liegt es daran, dass beim ersten Code-Segment die Ausführung "pausiert" wird beim show(), beim zweiten Code nicht mehr. Kann mir jemand sagen, was ich machen muss, dass auch beim zweiten Code eine Konsolenausgabe mit den Koordinaten erscheint?

Schon jetzt herzlichen Dank!
Antworten