Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

key_press_event in pyqt4 embedded matplotlib #707

Closed
psaurav opened this Issue Feb 18, 2012 · 4 comments

Comments

Projects
None yet
4 participants

psaurav commented Feb 18, 2012

Matplotlib does not respond to key presses while embedded in PyQt4. I have verified that key presses work with Tkinter. My system: Matplotlib 1.1.0, python 2.6.5 on Ubuntu. The code I have used is given below:

--code begins--
import sys
import numpy as np
from matplotlib.figure import Figure

from PyQt4.QtCore import *
from PyQt4.QtGui import *

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar

class AppForm(QMainWindow):
def init(self, parent=None):
QMainWindow.init(self, parent)
#self.x, self.y = self.get_data()
self.data = self.get_data2()
self.create_main_frame()
self.on_draw()

def create_main_frame(self):
    self.main_frame = QWidget()

    self.fig = Figure((5.0, 4.0), dpi=100)
    self.canvas = FigureCanvas(self.fig)
    self.canvas.setParent(self.main_frame)
    self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)

    self.canvas.mpl_connect('key_press_event', self.on_key_press)

    vbox = QVBoxLayout()
    vbox.addWidget(self.canvas)         # the matplotlib canvas
    vbox.addWidget(self.mpl_toolbar)
    self.main_frame.setLayout(vbox)
    self.setCentralWidget(self.main_frame)

def get_data2(self):
    return np.arange(20).reshape([4,5]).copy()

def on_draw(self):
    self.fig.clear()
    self.axes = self.fig.add_subplot(111)
    #self.axes.plot(self.x, self.y, 'ro')
    self.axes.imshow(self.data, interpolation='nearest')
    self.canvas.draw()

def on_key_press(self, event):
    print 'you pressed', event.key

def main():
app = QApplication(sys.argv)
form = AppForm()
form.show()
app.exec_()

if name == "main":
main()
--code ends--

psaurav commented Feb 20, 2012

I am resubmitting the code --- this time properly formatted.

import sys
import numpy as np
from matplotlib.figure import Figure

from PyQt4.QtCore import *
from PyQt4.QtGui import *

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar


class AppForm(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        #self.x, self.y = self.get_data()
        self.data = self.get_data2()
        self.create_main_frame()
        self.on_draw()

    def create_main_frame(self):
        self.main_frame = QWidget()

        self.fig = Figure((5.0, 4.0), dpi=100)
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)

        self.canvas.mpl_connect('key_press_event', self.on_key_press)

        vbox = QVBoxLayout()
        vbox.addWidget(self.canvas)         # the matplotlib canvas
        vbox.addWidget(self.mpl_toolbar)
        self.main_frame.setLayout(vbox)
        self.setCentralWidget(self.main_frame)

    def get_data2(self):
        return np.arange(20).reshape([4,5]).copy()

    def on_draw(self):
        self.fig.clear()
        self.axes = self.fig.add_subplot(111)
        #self.axes.plot(self.x, self.y, 'ro')
        self.axes.imshow(self.data, interpolation='nearest')
        self.canvas.draw()

    def on_key_press(self, event):
        print 'you pressed', event.key


def main():
    app = QApplication(sys.argv)
    form = AppForm()
    form.show()
    app.exec_()

if __name__ == "__main__":
    main()
Member

WeatherGod commented Feb 25, 2012

This might be related to issue 525

Collaborator

jdh2358 commented Feb 26, 2012

You need to activate the focus of qt onto your mpl canvas.

Just add:

self.canvas.setFocusPolicy( Qt.ClickFocus )
self.canvas.setFocus()

right after you call setParent.

Also, I just submitted a pull request #717 which exposes to embedding applications the default mpl keypress handler described at http://matplotlib.sourceforge.net/users/navigation_toolbar.html#navigation-keyboard-shortcuts. I modified your example to use this handler and submitted it as an example: https://github.com/jdh2358/matplotlib/blob/00824666129917301b21404b364879cd4b732495/examples/user_interfaces/embedding_in_qt4_wtoolbar.py

Member

pelson commented Jul 1, 2012

@jdh2358 has provided a solution for this issue. closing.

@pelson pelson closed this Jul 1, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment