如何从 matplotlib 中的另一个脚本调用 onclick 事件?

Posted

技术标签:

【中文标题】如何从 matplotlib 中的另一个脚本调用 onclick 事件?【英文标题】:How to call onclick event from another script in matplotlib? 【发布时间】:2020-04-06 20:18:54 【问题描述】:

我正在开发一个桌面应用程序,由于复杂性,我不得不分解成不同的部分。无论您是双击还是单击(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...')

【问题讨论】:

好吧,你正在接近这个复杂 - 只需将其简化为:fig.canvas.mpl_connect(self.mplClicked) 然后将其添加为插槽函数@pyqtSlot(object) def mplClicked(self, Event): 然后在该函数中调用您的新函数@987654328 @ 【参考方案1】:

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...')

【讨论】:

可以,但是在我的实际程序中,我需要传递图形所在的类的实例,以便我可以操作该类中的一些变量。使用您提出的解决方案,我该如何实现? @AsadUllahButt,您可以在您的 onclick(event) 函数中获得带有 event.canvasCanvas 嗯,他的错误是他缺少一个参数,而您的解决方案是删除一个参数?? @DennisJensen,OP 问题是“如何从 matplotlib 中的另一个脚本调用 onclick 事件?”,而不是如何将另一个参数传递给函数? ;) @DennisJensen 是的,在问题中他的onclick 函数没有使用self 参数,因此删除它是合乎逻辑的。

以上是关于如何从 matplotlib 中的另一个脚本调用 onclick 事件?的主要内容,如果未能解决你的问题,请参考以下文章

从 Powershell ISE 中的另一个 PS1 脚本调用 PowerShell 脚本 PS1

如何从shell脚本中的另一个目录获取文件的完整路径? [复制]

如何从AngularJS中的另一个控制器调用函数? [复制]

如何从Angular中的另一个函数调用一个函数?

如何从 C# 中的另一个私有类调用私有类变量

如何从 Rcpp 中的另一个函数调用一个函数?