我想实时在matplot的画布上跟踪鼠标的位置。
现在,我构建了一个继承Qwidget(行为类似于容器)的MplWidget,然后在其上构建了一个画布来显示该图。但是,问题是我只能在画布区域之外的填充区域中跟踪鼠标的位置。
由于我的画布继承了不是QWidget的matplotlib.figure,因此它没有setMouseTracking()属性。这样,如何解决这个问题?
我找到了一个非常有用的链接。如何实时返回鼠标坐标?。但是,它也遇到相同的问题。当鼠标悬停在标签(文本区域)上时,跟踪功能似乎被中断。
我的此类代码如下所示:
from PyQt5.QtWidgets import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class MplWidget(QWidget):
def __init__(self, parent=None):
# QWidget.__init__(self, parent)
super(QWidget, self).__init__(parent)
self.canvas = FigureCanvas(Figure())
vertical_layout = QVBoxLayout()
vertical_layout.addWidget(self.canvas)
self.canvas.axes = self.canvas.figure.add_subplot(111)
self.setLayout(vertical_layout)
self.setMouseTracking(True)
def mouseMoveEvent(self, e):
text = "x: {0}, y: {1}".format(e.x(), e.y())
print(text)
super(MplWidget, self).mouseMoveEvent(e)
def mousePressEvent(self, e):
print('click!')
如您所见,画布不是由Qt处理,而是由matplotlib处理,因此解决方案是使用该库提供的事件,如果您查看文档,会发现存在以下事件:
事件名称 类别和描述
'button_press_event' MouseEvent - mouse button is pressed 'button_release_event' MouseEvent - mouse button is released 'draw_event' DrawEvent - canvas draw (but before screen update) 'key_press_event' KeyEvent - key is pressed 'key_release_event' KeyEvent - key is released 'motion_notify_event' MouseEvent - mouse motion 'pick_event' PickEvent - an object in the canvas is selected 'resize_event' ResizeEvent - figure canvas is resized 'scroll_event' MouseEvent - mouse scroll wheel is rolled 'figure_enter_event' LocationEvent - mouse enters a new figure 'figure_leave_event' LocationEvent - mouse leaves a figure 'axes_enter_event' LocationEvent - mouse enters a new axes 'axes_leave_event' LocationEvent - mouse leaves an axes
在您的情况下,您应该使用以下事件:
例:
from PyQt5 import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class MplWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MplWidget, self).__init__(parent)
self.canvas = FigureCanvas(Figure())
vertical_layout = QtWidgets.QVBoxLayout(self)
vertical_layout.addWidget(self.canvas)
self.canvas.axes = self.canvas.figure.add_subplot(111)
self.canvas.mpl_connect("button_press_event", self.on_press)
self.canvas.mpl_connect("button_release_event", self.on_release)
self.canvas.mpl_connect("motion_notify_event", self.on_move)
def on_press(self, event):
print("press")
print("event.xdata", event.xdata)
print("event.ydata", event.ydata)
print("event.inaxes", event.inaxes)
print("x", event.x)
print("y", event.y)
def on_release(self, event):
print("release:")
print("event.xdata", event.xdata)
print("event.ydata", event.ydata)
print("event.inaxes", event.inaxes)
print("x", event.x)
print("y", event.y)
def on_move(self, event):
print("move")
print("event.xdata", event.xdata)
print("event.ydata", event.ydata)
print("event.inaxes", event.inaxes)
print("x", event.x)
print("y", event.y)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MplWidget()
w.show()
sys.exit(app.exec_())
问题内容: 尝试使用awt canvas上的鼠标来绘制图形(目前为线)。Iam首次尝试Java图形。所以不确定如何去做。这是我的第一次尝试: 问题:1)将窗口最小化并还原后,绘制的线条消失了(由于要重新绘制)2)我要的是该线条应跟随鼠标移动(拖动时)。最后一行应该从按下位置到释放鼠标的位置。现在请礼节,当鼠标移动时,将绘制新的线条。我不确定如何清除画布上的中间线。 有人可以帮我解决这些问题吗? 问
问题内容: 我希望每t毫秒定期跟踪一次鼠标光标的位置。因此,从本质上讲,当页面加载时- 该跟踪器应该启动,并且每(例如)每100毫秒启动一次,我应该获取posX和posY的新值并以表格形式打印出来。 我尝试了以下代码-但值没有刷新-表单框中仅显示posX和posY的初始值。关于如何启动和运行它的任何想法? 问题答案: 在事件处理程序接收到的对象上报告鼠标的位置,您可以将其附加到窗口(事件冒泡):
我正在研究GWT应用程序(类似于油漆)。在这里,我有一个HTML5画布,其中有一个功能,上下滚动鼠标滚轮将放大和缩小画布。 我搜索了很多,但没有找到解决此问题的方法。以下是我们所做的: 现在,上面的代码适用于另一个Angular应用程序,我在其中上下滚动div元素(有一个滚动条),但它不适用于GWT应用程序中的画布(没有滚动条)。 我使用Selenium 3.14.0,并在Chrome浏览器上运行
现在我有一个应用程序,可以让用户单击按钮浏览用作画布背景的图片。我想这样做,如果用户单击画布上的某个地方,则在该点放置一个节点。我假设我需要获取鼠标坐标。有没有一个简单的方法可以调用将节点放置在鼠标单击位置,或者我必须在这个链接中选择路线:WPF-使用鼠标事件在画布上绘图?提前谢谢。 编辑:添加了我尝试制作椭圆的代码。不过它不起作用,而且我不确定如何使用鼠标点击椭圆的坐标。我知道对于一行来说,它只
当我将单体应用拆成多个微服务之后,如何监控服务之间的依赖关系和调用链,以判断应用在哪个服务环节出了问题,哪些地方可以优化?这就需要用到分布式追踪(Distributed Tracing)。 CNCF 提出了分布式追踪的标准 OpenTracing,它提供用厂商中立的 API,并提供 Go、Java、JavaScript、Python、Ruby、PHP、Objective-C、C++ 和 C# 这九
我在画布上处理鼠标事件时遇到问题。我想用鼠标来绘制它,我已经想出了这些事件处理程序,但当我开始绘制时,它们什么都不做。 你能帮我告诉我遗漏了什么或者如何重写它以便它开始工作吗?
本章介绍如何使用Zipkin或Jaeger收集启用了Istio的应用程序的调用链信息。 完成本章后,你可以理解有关应用程序的所有假设以及如何使其参与跟踪,无论您使用何种语言/框架/平台构建应用程序。 BookInfo示例用来作为此任务的示例应用程序。 环境准备 参照安装指南的说明安装Istio。 如果您在安装过程中未启动Zipkin或Jaeger插件,则可以运行以下命令启动: 启动Zipkin:
问题内容: 将click事件处理程序添加到canvas元素(将返回click的x和y坐标)(相对于canvas元素)的最简单方法是什么? 不需要旧版浏览器兼容性,Safari,Opera和Firefox都可以。 问题答案: 这个答案很老了,它使用检查不再需要的旧浏览器,因为和属性在所有当前浏览器中都有效。您可能想查看PatriquesAnswer,以获得更简单,最新的解决方案。 最初的答案: 正如