55893


pyqt5でグラフ上をクリックしたときに座標が表示されるGUIは次のように書けます。

[code]

    import sys
    from PyQt5 import QtGui,QtCore, QtWidgets,QtMultimedia, QtMultimediaWidgets
    from PyQt5.QtWidgets import QDialog, QApplication, QVBoxLayout
    from PyQt5.QtCore import Qt
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    from matplotlib.figure import Figure
    import matplotlib.pyplot as plt
    
    import numpy as np
    
    
    class MyCanvas(FigureCanvas):
        def __init__(self, parent=None, width=5, height=4, dpi=100):
            fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = fig.add_subplot(111)
    
            self.plot_figure()
    
            FigureCanvas.__init__(self, fig)
            self.setParent(parent)
    
    
    class MyStaticMplCanvas(MyCanvas):
        def plot_figure(self):
            x=np.arange(0,2*np.pi,0.1)
            y=np.sin(x)
            self.axes.plot(x,y,"-")
            self.axes.set_xlabel("x")
            self.axes.set_ylabel("y")
            self.axes.set_xlim(0,2*np.pi)     
    
    
    
    
    class Main(QDialog):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
    
            #canvas = MyCanvas(self)
            canvas = MyStaticMplCanvas(self)
            canvas.mpl_connect('button_press_event', self.mousePressEvent)
    
            layout = QVBoxLayout()
            layout.addWidget(canvas)
    
            self.setLayout(layout)
    
            self.setWindowTitle('plot')
            self.show()
    
        def mousePressEvent(self,event):
            print(event.xdata)
            print(event.ydata)
            #print(event.x)
            #print(dir(event))
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Main()
    
        app.exec_()
    
[/code]

ここで、マウスプレスイベントの関数をMycanvasクラス内に移動させようとしました。そのように書き直したコードが次です。

[code]

    import sys
    from PyQt5 import QtGui,QtCore, QtWidgets,QtMultimedia, QtMultimediaWidgets
    from PyQt5.QtWidgets import QDialog, QApplication, QVBoxLayout
    from PyQt5.QtCore import Qt
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    from matplotlib.figure import Figure
    import matplotlib.pyplot as plt
    
    import numpy as np
    
    
    class MyCanvas(FigureCanvas):
        def __init__(self, parent=None, width=5, height=4, dpi=100):
            fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = fig.add_subplot(111)
    
            self.plot_figure()
    
            FigureCanvas.__init__(self, fig)
            self.setParent(parent)
    
    
        def mousePressEvent(self,event):
            #print("l")
            if event.button() == Qt.LeftButton:
                print(event.xdata)
                print(event.ydata)
    
            elif event.button() == Qt.RightButton:
                print("L")
    
    
    class MyStaticMplCanvas(MyCanvas):
        def plot_figure(self):
            x=np.arange(0,2*np.pi,0.1)
            y=np.sin(x)
            self.axes.plot(x,y,"-")
            self.axes.set_xlabel("x")
            self.axes.set_ylabel("y")
            self.axes.set_xlim(0,2*np.pi)     
    
    
    
    
    class Main(QDialog):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
    
            #canvas = MyCanvas(self)
            canvas = MyStaticMplCanvas(self)
    
            layout = QVBoxLayout()
            layout.addWidget(canvas)
    
            self.setLayout(layout)
    
            self.setWindowTitle('plot')
            self.show()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Main()
    
        app.exec_()
    
[/code]

しかし、この後者のコードではグラフ上をクリックしても何も起こりませんでした。エラーすら吐きませんでした。どこが悪かったのでしょうか。


CC BY-SA 4.0
2019-06-18T01:51:18.607
55891
2019-06-18T05:36:01.403
2019-06-18T02:04:15.310
19110
26529
question
python python3 pyqt5
pyqt5でマウスプレスイベントが思うように動作しない


この記事 [Connect mouse events in a Qt4 application embedding matplotlib
canvas](https://stackoverflow.com/q/47238239/9014308)
によると、`matloptlib`の[mpl_connect()](https://matplotlib.org/3.1.0/api/backend_bases_api.html#matplotlib.backend_bases.FigureCanvasBase.mpl_connect)というメソッドで連携を図るようです。

対応するイベント内容はこちら。[MouseEvent](https://matplotlib.org/3.1.0/api/backend_bases_api.html#matplotlib.backend_bases.MouseEvent)
/
[LocationEvent](https://matplotlib.org/3.1.0/api/backend_bases_api.html#matplotlib.backend_bases.LocationEvent)
/
[Event](https://matplotlib.org/3.1.0/api/backend_bases_api.html#matplotlib.backend_bases.Event)

`def
mousePressEvent(self,event):`は削除して、代わりに以下を`self.setParent(parent)`の下に入れてください。

[code]

            self.mpl_connect('button_press_event', self.on_button_press)
    
        def on_button_press(self,event):
            if event.button == 1: # MouseButton.LEFT:
                print('Left Button')
                print('xdata = ' + str(event.xdata))
                print('ydata = ' + str(event.ydata))
            elif event.button == 3: # MouseButton.RIGHT:
                print('Right Button')
    
[/code]

* * *

それから、その先にやりたくなるかもしれない記事がいくつかあります。

[python/matplotlibの図上にてクリックで座標値を取得したりキーボード入力値を取得したりする](https://qiita.com/HajimeKawahara/items/abc24fa2216009523656)

[cross hairs in python
animation](https://stackoverflow.com/q/19935445/9014308) / [matplotlib
crosshair cursor in PyQt dialog does not show
up](https://stackoverflow.com/q/36350771/9014308)

[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)


CC BY-SA 4.0
2019-06-18T04:37:08.787
55893
2019-06-18T05:36:01.403
2019-06-18T05:36:01.403
26370
26370
55891
answer