Title: All subclasses of LocationEvent could be used in cbook.callbacks before being fully initialized · Issue #15139 · matplotlib/matplotlib · GitHub
Open Graph Title: All subclasses of LocationEvent could be used in cbook.callbacks before being fully initialized · Issue #15139 · matplotlib/matplotlib
X Title: All subclasses of LocationEvent could be used in cbook.callbacks before being fully initialized · Issue #15139 · matplotlib/matplotlib
Description: Bug report Bug summary When dealing with callbacks for event that are subclass of LocationEvent (KeyEvent and MouseEvent) in FigureCanvasBase methods (like motion_notify_event), an event object can be passed to callbacks.process for 'axe...
Open Graph Description: Bug report Bug summary When dealing with callbacks for event that are subclass of LocationEvent (KeyEvent and MouseEvent) in FigureCanvasBase methods (like motion_notify_event), an event object can...
X Description: Bug report Bug summary When dealing with callbacks for event that are subclass of LocationEvent (KeyEvent and MouseEvent) in FigureCanvasBase methods (like motion_notify_event), an event object can...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/15139
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"All subclasses of LocationEvent could be used in cbook.callbacks before being fully initialized","articleBody":"\u003c!--To help us understand and resolve your issue, please fill out the form to the best of your ability.--\u003e\r\n\u003c!--You can feel free to delete the sections that do not apply.--\u003e\r\n\r\n### Bug report\r\n\r\n**Bug summary**\r\n\r\nWhen dealing with callbacks for event that are subclass of LocationEvent (KeyEvent and MouseEvent) in FigureCanvasBase methods (like motion_notify_event), an event object can be passed to callbacks.process for 'axes_enter_event' before being fully initialized. This can cause bugs.\r\n\r\n\u003c!--A short 1-2 sentences that succinctly describes the bug--\u003e\r\n\r\n**Code for reproduction**\r\n I took the first example of the examples page and added theses lines:\r\n\r\n```python\r\ndef mycallback (event):\r\n print (type(event), hasattr (event, 'button'))\r\n print (event) # raise an exception as self.button is needed in MouseEvent.__str__\r\n\r\nplt.gca().figure.canvas.mpl_connect ('axes_enter_event', mycallback)\r\n```\r\n\r\nFull code\r\n\r\n```python\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\n\r\nN = 5\r\nmenMeans = (20, 35, 30, 35, 27)\r\nwomenMeans = (25, 32, 34, 20, 25)\r\nmenStd = (2, 3, 4, 1, 2)\r\nwomenStd = (3, 5, 2, 3, 3)\r\nind = np.arange(N) # the x locations for the groups\r\nwidth = 0.35 # the width of the bars: can also be len(x) sequence\r\n\r\np1 = plt.bar(ind, menMeans, width, yerr=menStd)\r\np2 = plt.bar(ind, womenMeans, width,\r\n bottom=menMeans, yerr=womenStd)\r\n\r\nplt.ylabel('Scores')\r\nplt.title('Scores by group and gender')\r\nplt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))\r\nplt.yticks(np.arange(0, 81, 10))\r\nplt.legend((p1[0], p2[0]), ('Men', 'Women'))\r\n\r\ndef mycallback (event):\r\n print (type(event), hasattr (event, 'button'))\r\n print (event)\r\n\r\nplt.gca().figure.canvas.mpl_connect ('axes_enter_event', mycallback)\r\n\r\nplt.show()\r\n```\r\n\r\n**Actual outcome**\r\n\r\nWhen the mouse is moved over the axes, it prints\r\n\r\n```\r\n\u003cclass 'matplotlib.backend_bases.MouseEvent'\u003e False\r\nTraceback (most recent call last):\r\n File \"/home/cyril/.local/lib/python3.7/site-packages/matplotlib/cbook/__init__.py\", line 216, in process\r\n func(*args, **kwargs)\r\n File \"bar_stacked.py\", line 37, in mycallback\r\n print (event)\r\n File \"/home/cyril/.local/lib/python3.7/site-packages/matplotlib/backend_bases.py\", line 1445, in __str__\r\n return (f\"{self.name}: \"\r\nAttributeError: 'MouseEvent' object has no attribute 'button'\r\n```\r\n\r\nThe MouseEvent object is not fully initialized (or else it would have a 'button' attribute).\r\nThe problem is due to the following calls:\r\n - when a event is captured, the method `motion_notify_event` of `FigureCanvasBase` is called\r\n - it creates an MouseEvent object, so `MouseEvent.__init__` is called\r\n - the first thing the initializer does is calling `LocationEvent.__init__` (initializer of the parent class) [ before setting self.button ]\r\n - the last thing `LocationEvent.__init__` does is calling `self._update_enter_leave`\r\n - In the method `self._update_enter_leave` (of the class LocationEvent), callbacks.process is called for axes_enter_event (if mouse is in the right location) with self (a MouseEvent object) as argument for the callbacks function. The problem is here, the argument should be of LocationEvent type (according to the doc). And self cannot be use here as it is not finished being initialized.\r\n\r\nA similar problem occurs for KeyEvent (a subclass of LocationEvent) with the attributes 'key'.\r\n\r\n**Expected outcome**\r\n\r\nAccording to the doc, the type of event for `axes_enter_event` shoud be LocationEvent not MouseEvent\r\n\r\n\r\n**Matplotlib version**\r\n * Operating system: Linux\r\n * Matplotlib version: 3.1\r\n * Matplotlib backend (`print(matplotlib.get_backend())`): Qt5Agg\r\n * Python version: 3.7","author":{"url":"https://github.com/cyrilbouvier","@type":"Person","name":"cyrilbouvier"},"datePublished":"2019-08-27T08:43:39.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/15139/matplotlib/issues/15139"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:243e54ad-3421-0924-03d2-ef69d1876c49 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DA40:1BA1D0:E7D5DB:1358209:6A532FDA |
| html-safe-nonce | 938677865818acaefd5671d4e39a91f56703dc145de2ae2a0944f6bd1a5c92bb |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQTQwOjFCQTFEMDpFN0Q1REI6MTM1ODIwOTo2QTUzMkZEQSIsInZpc2l0b3JfaWQiOiI4NzA4MzYwMjc2NzkyMjU4NTIyIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 841c1a77de3038849b9a91cd031c53b29e3217e9f8a9b89bbe32b5a0e1aa8d83 |
| hovercard-subject-tag | issue:485670688 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/15139/issue_layout |
| twitter:image | https://opengraph.githubassets.com/ab5ef62ea2abbba20e3252bf871a7b85924937004f9f9be9722f6ec37ac8e5cb/matplotlib/matplotlib/issues/15139 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/ab5ef62ea2abbba20e3252bf871a7b85924937004f9f9be9722f6ec37ac8e5cb/matplotlib/matplotlib/issues/15139 |
| og:image:alt | Bug report Bug summary When dealing with callbacks for event that are subclass of LocationEvent (KeyEvent and MouseEvent) in FigureCanvasBase methods (like motion_notify_event), an event object can... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | cyrilbouvier |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width