René's URL Explorer Experiment


Title: Can't interrupt start_event_loop() at backend_qt5.py::FigureCanvasQt · Issue #13315 · matplotlib/matplotlib · GitHub

Open Graph Title: Can't interrupt start_event_loop() at backend_qt5.py::FigureCanvasQt · Issue #13315 · matplotlib/matplotlib

X Title: Can't interrupt start_event_loop() at backend_qt5.py::FigureCanvasQt · Issue #13315 · matplotlib/matplotlib

Description: Bug report Bug summary (suggested fix is in the very bottom) This internal method is used in plt.pause() and BlockingInput class (I don't know what the latter does). The problem is approximately since Matplotlib 2.0.0 (but I don't know w...

Open Graph Description: Bug report Bug summary (suggested fix is in the very bottom) This internal method is used in plt.pause() and BlockingInput class (I don't know what the latter does). The problem is approximately si...

X Description: Bug report Bug summary (suggested fix is in the very bottom) This internal method is used in plt.pause() and BlockingInput class (I don't know what the latter does). The problem is approximatel...

Opengraph URL: https://github.com/matplotlib/matplotlib/issues/13315

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Can't interrupt start_event_loop() at backend_qt5.py::FigureCanvasQt ","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** (suggested fix is in the very bottom)\r\n\r\nThis internal method is used in `plt.pause()` and BlockingInput class (I don't know what the latter does). \r\n\r\nThe problem is approximately since Matplotlib 2.0.0 (but I don't know what exactly has changed). In the current implementation, the method execution can't be interrupted easily since it is based on `event_loop.exec_()` (internally C++) function that locks out the Python interpreter and prevents it from processing SIGINT as KeyboardInterrupt.\r\n\r\nThe problem is clearly visible when you run some kind of animation (see example below), since the SIGINT is getting understood as KeyboardInterrupt by the target function of the Timer (which is in Python and thus the interpreter gets to run from time to time in the event loop). However, this exception in the timer target can't stop the even loop, and it continues. \r\n\r\nIn overall, this problem actually renders `plt.pause()` practically unusable (this, and the window focusing issues). So either we should deprecate `plt.pause()` or fix it, as I suggest below.\r\n\r\n**Code for reproduction**\r\n\r\n\u003c!--A minimum code snippet required to reproduce the bug.\r\nPlease make sure to minimize the number of dependencies required, and provide\r\nany necessary plotted data.\r\nAvoid using threads, as Matplotlib is (explicitly) not thread-safe.--\u003e\r\n\r\n```python\r\n%pylab qt5\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom matplotlib.animation import FuncAnimation\r\nfrom matplotlib._pylab_helpers import Gcf\r\n\r\nstopped = False\r\nfig, ax = plt.subplots()\r\nxdata, ydata = [], []\r\nln, = plt.plot([], [], 'ro')\r\n\r\ndef init():\r\n    ax.set_xlim(0, 2*np.pi)\r\n    ax.set_ylim(-1, 1)\r\n    return ln,\r\n\r\ndef update(frame):\r\n    xdata.append(frame)\r\n    ydata.append(np.sin(frame))\r\n    ln.set_data(xdata, ydata)\r\n    if frame == 2*np.pi:\r\n        stopped = True\r\n    return ln,\r\n\r\nani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),\r\n                    init_func=init, blit=True, interval = 50, repeat=False)\r\n\r\n# wait for the plotting/underlying process to end\r\ntry:\r\n    while not stopped:\r\n        manager = Gcf.get_fig_manager(fig.number)\r\n        manager.canvas.start_event_loop(1)  \r\nexcept KeyboardInterrupt:\r\n    plt.close(fig)\r\n    print(\"KeyboardInterrupt caught\")\r\nexcept AttributeError:\r\n    print(\"Figure closed from GUI\")\r\n```\r\n\r\n**Actual outcome**\r\n\r\nOn pressing stop button in Jupyter:\r\n\r\n\u003cimg src=\"https://user-images.githubusercontent.com/3819012/51903616-ac730e00-23cd-11e9-9b6e-4094f08beaf2.png\" width=\"500\"\u003e\r\n\r\nAnd then the waiting cycle continues with no error. The exceptions on the Qt event loop get caught somewhere inside?\r\n\r\n**Expected outcome**\r\n\r\nClean stop and closed figure on the `except KeyboardInterrupt` clause.\r\n\r\n**Matplotlib version**\r\n\r\n    Operating system: 4.18.16-100.fc27.x86_64\r\n    Matplotlib version: 3.0.2\r\n    Matplotlib backend: Qt5Agg\r\n    Python version: 3.6\r\n    IPython: 7.2.0\r\n    Jupyter notebook: 5.7.4\r\n\r\nEverything installed with pip in a virtualenv.\r\n\r\n### Suggested fix\r\n\r\nThis problem has annoyed me for quite some time, and I am very glad that it seems that there is the solution. It is very closely related to #13302, and is solved similarly (using `signal.set_wakeup_fd()` and `socket.createsocketpair()`). \r\n\r\nThe problematic method should be rewritten as follows:\r\n```python\r\ndef start_event_loop(self, timeout=0):\r\n    if hasattr(self, \"_event_loop\") and self._event_loop.isRunning():\r\n        raise RuntimeError(\"Event loop already running\")\r\n    self._event_loop = event_loop = QtCore.QEventLoop()\r\n    if timeout:\r\n        timer = QtCore.QTimer.singleShot(timeout * 1000, event_loop.quit)\r\n\r\n    SIGINTHandler(qApp)\r\n    interrupted = False\r\n\r\n    def sigint_handler():\r\n        nonlocal interrupted\r\n        event_loop.quit()\r\n        interrupted = True\r\n\r\n    old_sigint_handler = signal.getsignal(signal.SIGINT)\r\n    signal.signal(signal.SIGINT, lambda sig, _: sigint_handler())\r\n\r\n    try:\r\n        event_loop.exec_()\r\n    finally:\r\n        signal.signal(signal.SIGINT, old_sigint_handler)\r\n        if interrupted:\r\n            raise KeyboardInterrupt\r\n```\r\nSIGINTHandler class may be found in #13306","author":{"url":"https://github.com/vdrhtc","@type":"Person","name":"vdrhtc"},"datePublished":"2019-01-29T12:00:48.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":13},"url":"https://github.com/13315/matplotlib/issues/13315"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:a135cf9c-d259-03df-fadd-30e46cc2b0b9
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idCCA2:1CCA14:6B3B30:906476:6A52FF8E
html-safe-nonceeb4a697e6495c15e44d9ffd36ce820ae615e0798ca33b3c276a6b3e0938f565c
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQ0EyOjFDQ0ExNDo2QjNCMzA6OTA2NDc2OjZBNTJGRjhFIiwidmlzaXRvcl9pZCI6Ijc1NTM5NDYyMzY2OTAzMDA4MTQiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac9a9c9681f1dd8cf53ba8b1ed4bf81c5109bf32ec2cd3980d22b9284bf629b66a
hovercard-subject-tagissue:404257692
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/13315/issue_layout
twitter:imagehttps://opengraph.githubassets.com/cc55bcd63d27aaff30fc929da9376395b20663b6c78671dd4eee15c7eebac3e5/matplotlib/matplotlib/issues/13315
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/cc55bcd63d27aaff30fc929da9376395b20663b6c78671dd4eee15c7eebac3e5/matplotlib/matplotlib/issues/13315
og:image:altBug report Bug summary (suggested fix is in the very bottom) This internal method is used in plt.pause() and BlockingInput class (I don't know what the latter does). The problem is approximately si...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernamevdrhtc
hostnamegithub.com
expected-hostnamegithub.com
Noneb9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb
turbo-cache-controlno-preview
go-importgithub.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git
octolytics-dimension-user_id215947
octolytics-dimension-user_loginmatplotlib
octolytics-dimension-repository_id1385122
octolytics-dimension-repository_nwomatplotlib/matplotlib
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1385122
octolytics-dimension-repository_network_root_nwomatplotlib/matplotlib
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release07a982c1d40157c619b364352b704c3ce66bb332
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/matplotlib/matplotlib/issues/13315#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fissues%2F13315
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fissues%2F13315
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=matplotlib%2Fmatplotlib
Reloadhttps://github.com/matplotlib/matplotlib/issues/13315
Reloadhttps://github.com/matplotlib/matplotlib/issues/13315
Reloadhttps://github.com/matplotlib/matplotlib/issues/13315
Please reload this pagehttps://github.com/matplotlib/matplotlib/issues/13315
matplotlib https://github.com/matplotlib
matplotlibhttps://github.com/matplotlib/matplotlib
Please reload this pagehttps://github.com/matplotlib/matplotlib/issues/13315
Notifications https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Fork 8.4k https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Star 23k https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Code https://github.com/matplotlib/matplotlib
Issues 1.1k https://github.com/matplotlib/matplotlib/issues
Pull requests 408 https://github.com/matplotlib/matplotlib/pulls
Actions https://github.com/matplotlib/matplotlib/actions
Projects https://github.com/matplotlib/matplotlib/projects
Wiki https://github.com/matplotlib/matplotlib/wiki
Security and quality 0 https://github.com/matplotlib/matplotlib/security
Insights https://github.com/matplotlib/matplotlib/pulse
Code https://github.com/matplotlib/matplotlib
Issues https://github.com/matplotlib/matplotlib/issues
Pull requests https://github.com/matplotlib/matplotlib/pulls
Actions https://github.com/matplotlib/matplotlib/actions
Projects https://github.com/matplotlib/matplotlib/projects
Wiki https://github.com/matplotlib/matplotlib/wiki
Security and quality https://github.com/matplotlib/matplotlib/security
Insights https://github.com/matplotlib/matplotlib/pulse
Can't interrupt start_event_loop() at backend_qt5.py::FigureCanvasQt https://github.com/matplotlib/matplotlib/issues/13315#top
GUI: Qthttps://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22GUI%3A%20Qt%22
status: closed as inactiveIssues closed by the "Stale" Github Action. Please comment on any you think should still be open.https://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22status%3A%20closed%20as%20inactive%22
status: inactiveMarked by the “Stale” Github Actionhttps://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22status%3A%20inactive%22
https://github.com/vdrhtc
vdrhtchttps://github.com/vdrhtc
on Jan 29, 2019https://github.com/matplotlib/matplotlib/issues/13315#issue-404257692
https://user-images.githubusercontent.com/3819012/51903616-ac730e00-23cd-11e9-9b6e-4094f08beaf2.png
#13302https://github.com/matplotlib/matplotlib/issues/13302
#13306https://github.com/matplotlib/matplotlib/pull/13306
GUI: Qthttps://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22GUI%3A%20Qt%22
status: closed as inactiveIssues closed by the "Stale" Github Action. Please comment on any you think should still be open.https://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22status%3A%20closed%20as%20inactive%22
status: inactiveMarked by the “Stale” Github Actionhttps://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22status%3A%20inactive%22
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.