Как вызвать событие onclick из другого скрипта в matplotlib? - PullRequest
1 голос
/ 06 апреля 2020

Я разрабатываю настольное приложение, которое из-за сложности пришлось разбить на несколько частей. Этот код просто печатает, дважды ли вы щелкнули мышью или щелкнули мышью на объекте рисунка (matplotlib). Ниже приведена упрощенная версия:

from PyQt5.QtWidgets import QMainWindow, QApplication
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Matplotlib event handling')
        self.setGeometry(400, 400, 900, 500)
        canvas = Canvas(self, width=8, height=4)
        canvas.move(0, 0)

class Canvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=5, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        fig.canvas.mpl_connect('button_press_event', self.onclick)
        self.plot()

    def plot(self):
        x = [i for i in range(100)]
        y = [i**2 for i in range(100)]

        ax = self.figure.add_subplot(111)
        ax.plot(x,y, color='red')

    def onclick(self, event):
        if event.dblclick:
            print("You doubled clicked...")
        else:
            print('You single clicked...')


app = QApplication(sys.argv)
window = Window()
window.show()
app.exec()

Программа работает нормально, но если я вызываю функцию onclick из другого скрипта, возникает следующая ошибка:

TypeError: onclick() missing 1 required positional argument: 'event'

Я понимаю, что это как-то связано с областью действия функции, но кто-нибудь может мне объяснить, что я делаю неправильно ??

Оба сценария таковы:

# script1.py

from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from script2 import *

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Matplotlib event handling')
        self.setGeometry(400, 400, 900, 500)
        canvas = Canvas(self, width=8, height=4)
        canvas.move(0, 0)


class Canvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=5, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        fig.canvas.mpl_connect('button_press_event', onclick(self))
        self.plot()

    def plot(self):
        x = [i for i in range(100)]
        y = [i ** 2 for i in range(100)]

        ax = self.figure.add_subplot(111)
        ax.plot(x, y, color='red')


app = QApplication(sys.argv)
window = Window()
window.show()
app.exec()

И ...

# script2.py


def onclick(self, event):
    if event.dblclick:
        print("You doubled clicked...")
    else:
        print('You single clicked...')

1 Ответ

3 голосов
/ 06 апреля 2020

onclick теперь является собственной функцией, отдельной от класса, поэтому удалите параметр self.

def onclick(event):
   ...

И сигнал в Canvas становится

fig.canvas.mpl_connect('button_press_event', onclick)

Если вы хотите передать экземпляр, имеет смысл сохранить onclick внутри класса Canvas. Несмотря на это, вы можете подключить сигнал таким же образом, как это:

fig.canvas.mpl_connect('button_press_event', lambda event: onclick(self, event))

И определить onclick:

def onclick(instance, event):
    print(instance)
    if event.dblclick:
        print("You doubled clicked...")
    else:
        print('You single clicked...')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...