Использование масштабирования мыши и левой кнопки для печати реальных данных
У меня проблема с мышью на pyqt5.
Вопрос: Когда я использую функцию масштабирования, я не могу использовать "левую кнопку мыши" для печати моих реальных данных. Здесь я добавляю событие левой мыши в свой код (как показывает маркер кода "*** to ***"), но событие функции масштабирования не работало в моем коде.
Как мне использовать обе функции (масштабирование и левая кнопка мыши)? Как мне отладить код?
import sys
import random
import matplotlib
matplotlib.use("Qt5Agg")
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
from PyQt5.QtCore import *
import re
class MyMplCanvas(FigureCanvas):
def __init__(self, parent=None, width=10, height=4, dpi=100):
FigureCanvas.__init__(self, Figure(figsize=(width, height), dpi=dpi))
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.axes = self.figure.add_subplot(111)
self.mpl_connect("motion_notify_event", self.on_move)
self.po_annotation = []
self.ff=[]
def start_static_plot(self):
for i in range(0, 990):
x = i
y = x ** 0.05
(point,) = self.axes.plot(x, y, "-o")
annotation = self.axes.annotate(
("x=" + str(x), "y=" + str(y)),
xy=(x + 0.7, y + 0.7),
xycoords="data",
xytext=(x + 0.1, y + 0.1),
textcoords="data",
horizontalalignment="left",
arrowprops=dict(arrowstyle="simple", connectionstyle="arc3,rad=+0.2"),
bbox=dict(boxstyle="round", facecolor="w", edgecolor="0.1", alpha=0.9),
)
annotation.set_visible(False)
self.po_annotation.append([point, annotation])
self.axes.set_xlim(-0.5, 1000)
self.axes.set_ylim(-5, 9.5 ** 2)
def on_move(self, event):
visibility_changed = False
for point, annotation in self.po_annotation:
should_be_visible = point.contains(event)[0]
if should_be_visible != annotation.get_visible():
visibility_changed = True
annotation.set_visible(should_be_visible)
datachouse=str(annotation)
pattern = re.compile(r'(?<=x=)\d+\.?\d*')
f=pattern.findall(datachouse)
self.ff = np.loadtxt(f)
if visibility_changed:
self.draw()
***def mouseReleaseEvent(self, event):
if(event.button() == Qt.LeftButton):
print("result=",self.ff) ***
class MatplotlibWidget(QWidget):
def __init__(self, parent=None):
super(MatplotlibWidget, self).__init__(parent)
self.initUi()
def initUi(self):
self.layout = QVBoxLayout(self)
self.mpl = MyMplCanvas(self, width=10, height=5, dpi=100)
self.mpl.start_static_plot()
***self.mpl_ntb = NavigationToolbar(self.mpl, self)
self.layout.addWidget(self.mpl_ntb)***
self.layout.addWidget(self.mpl)
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = MatplotlibWidget()
ui.mpl.start_static_plot()
ui.show()
sys.exit(app.exec_())
1 ответ
Решение
Если вы не хотите удалять поведение метода по умолчанию, вы должны вызвать родительский метод:
def mouseReleaseEvent(self, event):
super(MyMplCanvas, self).mouseReleaseEvent(event)
if event.button() == Qt.LeftButton:
print("result=", self.ff)