Matplotlib'key_press_event'没有响应

sal*_*sov 4 matplotlib python-3.x pyqt5

通过单击图上的鼠标按钮: self.canvas.Fig.canvas.mpl_connect('button_press_event', self.button_press)

我可以通过在状态栏中打印"按下按钮"来接收信号并生成答案 self.statusBar().showMessage("Key pressed", 400)

但由于某些原因,同一段代码不能用于按键(键盘): self.canvas.Fig.canvas.mpl_connect('key_press_event', self.key_press)

未显示"按下按键"消息,表示未发生任何事件或未收到任何信号.

这是我所有必备课程的MWE:

import sys
import matplotlib 
matplotlib.use("Qt5Agg")
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas


class MyMplCanvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100,data=[[]],timedelay=[],wavelength=[]):
        self.Fig = Figure(figsize=(width, height), dpi=dpi)
        self.Dataplot = self.Fig.add_subplot(111)

        self.compute_initial_figure(data,timedelay, wavelength)    

        FigureCanvas.__init__(self, self.Fig)
        self.setParent(parent)
        FigureCanvas.setSizePolicy(self,QSizePolicy.Expanding,QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self,data,timedelay,wavelength):
        pass

class MyStaticMplCanvas(MyMplCanvas):  
    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)

    def compute_initial_figure(self,data,timedelay,wavelength): 
        self.Dataplot.set_xlabel('Wavelength, nm')
        self.Dataplot.set_ylabel('Time delay, ~s')

class GraphView(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.main_widget = QtWidgets.QWidget(self)

        self.canvas = MyStaticMplCanvas(self.main_widget, width=8, height=8, dpi=100,data=[[]],timedelay=[],wavelength=[])

        self.canvas.Fig.canvas.mpl_connect('key_press_event', self.key_press)
        self.canvas.Fig.canvas.mpl_connect('button_press_event', self.button_press)

        self.layoutMain = QtWidgets.QHBoxLayout(self.main_widget)      
        self.layoutFigure = QtWidgets.QHBoxLayout()
        self.layoutMain.addLayout(self.layoutFigure)   
        self.layoutFigure.addWidget(self.canvas)


        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)

    def key_press(self,event):
        self.statusBar().showMessage("Key pressed", 400)

    def button_press(self,event):
        self.statusBar().showMessage("Button pressed", 400) 

def main():
    app = QApplication( sys.argv )
    a=GraphView()
    a.show() 
    app.exec()

if __name__ == '__main__':
    sys.exit(main()) 
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?

a_m*_*_67 8

我在这里找到了解决方案

self.canvas = MyStaticMplCanvas(self.main_widget, width=8, height=8, dpi=100,data=[[]],timedelay=[],wavelength=[])
Run Code Online (Sandbox Code Playgroud)

self.canvas.setFocusPolicy( QtCore.Qt.ClickFocus )
self.canvas.setFocus()
Run Code Online (Sandbox Code Playgroud)

单击画布使其具有焦点,然后您将看到key_presses