如何从 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.canvas
的 Canvas
类
嗯,他的错误是他缺少一个参数,而您的解决方案是删除一个参数??
@DennisJensen,OP 问题是“如何从 matplotlib 中的另一个脚本调用 onclick 事件?”,而不是如何将另一个参数传递给函数? ;)
@DennisJensen 是的,在问题中他的onclick
函数没有使用self
参数,因此删除它是合乎逻辑的。以上是关于如何从 matplotlib 中的另一个脚本调用 onclick 事件?的主要内容,如果未能解决你的问题,请参考以下文章
从 Powershell ISE 中的另一个 PS1 脚本调用 PowerShell 脚本 PS1
如何从shell脚本中的另一个目录获取文件的完整路径? [复制]