fix(present): black video flashes and other bugs linked to Qt (#465)

* Relies on Pixel Format instead of Size

* chore(lib): remove deprecated warning

* chore(deps): update lockfiles

* chore(lib): cleanup code

* chore(ci): run fmt

* chore: update changelog

* chore: typo

* chore(docs): remove ref. to black screen

* fix(deps): issue on Windows

---------

Co-authored-by: PeculiarProgrammer <179261820+PeculiarProgrammer@users.noreply.github.com>
This commit is contained in:
Jérome Eertmans
2024-08-26 17:29:39 +02:00
committed by GitHub
parent 3b23c7739d
commit 5b6f5eb1e4
7 changed files with 215 additions and 206 deletions

View File

@ -37,6 +37,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#429](https://github.com/jeertmans/manim-slides/pull/429)
- Fixed whitespace issue in default RevealJS template.
[#442](https://github.com/jeertmans/manim-slides/pull/442)
- Fixed black screen issue on recent Qt versions and device loss detected,
thanks to [@PeculiarProgrammer](https://github.com/PeculiarProgrammer)!
[#465](https://github.com/jeertmans/manim-slides/pull/465)
(unreleased-removed)=
### Removed

View File

@ -113,10 +113,7 @@ using optional dependencies:
and does not work with ManimGL;
- `manim` and `manimgl`, for installing the corresponding
dependencies;
- `pyqt6` to include PyQt6 Qt bindings. Those bindings are available
on most platforms and Python version, but produce a weird black
screen between slide with `manim-slides present`,
see [#QTBUG-118501](https://bugreports.qt.io/browse/QTBUG-118501);
- `pyqt6` to include PyQt6 Qt bindings;
- `pyqt6-full` to include `full` and `pyqt6`;
- `pyside6` to include PySide6 Qt bindings. Those bindings are available
on most platforms and Python version, except on Python 3.12[^2];

View File

@ -11,23 +11,6 @@ from ..commons import config_path_option, folder_path_option, verbosity_option
from ..config import Config, PresentationConfig
from ..logger import logger
PREFERRED_QT_VERSIONS = ("6.5.1", "6.5.2")
def warn_if_non_desirable_pyside6_version() -> None:
from qtpy import API, QT_VERSION
if sys.version_info < (3, 12) and (
API != "pyside6" or QT_VERSION not in PREFERRED_QT_VERSIONS
):
logger.warn(
f"You are using {API = }, {QT_VERSION = }, "
"but we recommend installing 'PySide6==6.5.2', mainly to avoid "
"flashing screens between slides, "
"see issue https://github.com/jeertmans/manim-slides/issues/293. "
"You can do so with `pip install 'manim-slides[pyside6]'`."
)
@click.command()
@folder_path_option
@ -302,8 +285,6 @@ def present(
if start_at[1]:
start_at_slide_number = start_at[1]
warn_if_non_desirable_pyside6_version()
from qtpy.QtCore import Qt
from qtpy.QtGui import QScreen

View File

@ -226,6 +226,8 @@ class Player(QMainWindow): # type: ignore[misc]
self.icon = QIcon(":/icon.png")
self.setWindowIcon(self.icon)
self.frame = QVideoFrame()
self.audio_output = QAudioOutput()
self.video_widget = QVideoWidget()
self.video_sink = self.video_widget.videoSink()
@ -240,18 +242,6 @@ class Player(QMainWindow): # type: ignore[misc]
self.presentation_changed.connect(self.presentation_changed_callback)
self.slide_changed.connect(self.slide_changed_callback)
old_frame = None
def frame_changed(frame: QVideoFrame) -> None:
nonlocal old_frame
if old_frame and (frame.size() != old_frame.size()):
self.video_sink.setVideoFrame(old_frame)
frame = old_frame
self.info.video_sink.setVideoFrame(frame)
old_frame = frame
self.info = Info(
full_screen=full_screen,
aspect_ratio_mode=aspect_ratio_mode,
@ -259,7 +249,7 @@ class Player(QMainWindow): # type: ignore[misc]
)
self.info.close_event.connect(self.closeEvent)
self.info.key_press_event.connect(self.keyPressEvent)
self.video_sink.videoFrameChanged.connect(frame_changed)
self.video_sink.videoFrameChanged.connect(self.frame_changed)
self.hide_info_window = hide_info_window
# Connecting key callbacks
@ -555,6 +545,34 @@ class Player(QMainWindow): # type: ignore[misc]
else:
self.setCursor(Qt.BlankCursor)
def frame_changed(self, frame: QVideoFrame) -> None:
"""
Slot to handle possibly invalid frames.
This slot cannot be decorated with ``@Slot`` as
the video sinks are handled in different threads.
As of Qt>=6.5.3, the last frame of every video is "flushed",
resulting in a short black screen between each slide.
To avoid this issue, we check every frame, and avoid playing
invalid ones.
References
----------
1. https://github.com/jeertmans/manim-slides/issues/293
2. https://github.com/jeertmans/manim-slides/pull/464
:param frame: The most recent frame.
"""
if frame.isValid():
self.frame = frame
else:
self.video_sink.setVideoFrame(self.frame) # Reuse previous frame
self.info.video_sink.setVideoFrame(self.frame)
def closeEvent(self, event: QCloseEvent) -> None: # noqa: N802
self.close()

View File

@ -60,7 +60,7 @@ full = [
magic = ["manim-slides[manim]", "ipython>=8.12.2"]
manim = ["manim>=0.18.0"]
manimgl = ["manimgl>=1.6.1;python_version<'3.12'"]
pyqt6 = ["pyqt6>=6.6.1"]
pyqt6 = ["pyqt6>=6.7.0"]
pyqt6-full = ["manim-slides[full,pyqt6]"]
pyside6 = ["pyside6>=6.6.1"]
pyside6-full = ["manim-slides[full,pyside6]"]

View File

@ -7,30 +7,31 @@
# all-features: true
# with-sources: false
# generate-hashes: false
# universal: false
-e file:.
alabaster==0.7.16
alabaster==1.0.0
# via sphinx
annotated-types==0.6.0
annotated-types==0.7.0
# via pydantic
asttokens==2.4.1
# via stack-data
attrs==23.2.0
attrs==24.2.0
# via jsonschema
# via referencing
av==12.0.0
av==12.3.0
# via manim-slides
babel==2.14.0
babel==2.16.0
# via sphinx
beautifulsoup4==4.12.3
# via furo
# via nbconvert
bleach==6.1.0
# via nbconvert
bracex==2.4
bracex==2.5
# via wcmatch
bump-my-version==0.21.0
certifi==2024.2.2
bump-my-version==0.26.0
certifi==2024.7.4
# via requests
cfgv==3.4.0
# via pre-commit
@ -48,17 +49,23 @@ click-default-group==1.2.4
# via manim-slides
cloup==3.0.5
# via manim
colorama==0.4.6
# via click
# via ipython
# via pytest
# via sphinx
# via tqdm
colour==0.1.5
# via manimgl
comm==0.2.2
# via ipykernel
contourpy==1.2.1
# via matplotlib
coverage==7.4.4
coverage==7.6.1
# via pytest-cov
cycler==0.12.1
# via matplotlib
debugpy==1.8.1
debugpy==1.8.5
# via ipykernel
decorator==5.1.1
# via ipython
@ -67,7 +74,7 @@ defusedxml==0.7.1
# via nbconvert
distlib==0.3.8
# via virtualenv
docutils==0.20.1
docutils==0.21.2
# via manim-slides
# via myst-parser
# via nbsphinx
@ -75,46 +82,46 @@ docutils==0.20.1
# via sphinx-click
executing==2.0.1
# via stack-data
fastjsonschema==2.19.1
fastjsonschema==2.20.0
# via nbformat
filelock==3.13.4
filelock==3.15.4
# via virtualenv
fonttools==4.53.0
fonttools==4.53.1
# via matplotlib
furo==2024.1.29
furo==2024.8.6
# via manim-slides
glcontext==2.5.0
glcontext==3.0.0
# via moderngl
identify==2.5.35
identify==2.6.0
# via pre-commit
idna==3.7
idna==3.8
# via requests
imagesize==1.4.1
# via sphinx
iniconfig==2.0.0
# via pytest
ipykernel==6.29.4
ipykernel==6.29.5
# via manim-slides
ipython==8.18.1
ipython==8.26.0
# via ipykernel
# via manim-slides
# via manimgl
isosurfaces==0.1.0
isosurfaces==0.1.2
# via manim
# via manimgl
jedi==0.19.1
# via ipython
jinja2==3.1.3
jinja2==3.1.4
# via manim-slides
# via myst-parser
# via nbconvert
# via nbsphinx
# via sphinx
jsonschema==4.21.1
jsonschema==4.23.0
# via nbformat
jsonschema-specifications==2023.12.1
# via jsonschema
jupyter-client==8.6.1
jupyter-client==8.6.2
# via ipykernel
# via nbclient
jupyter-core==5.7.2
@ -127,7 +134,7 @@ jupyterlab-pygments==0.3.0
# via nbconvert
kiwisolver==1.4.5
# via matplotlib
lxml==5.2.1
lxml==5.3.0
# via manim-slides
# via python-pptx
manim==0.18.1
@ -138,7 +145,7 @@ manimpango==0.5.0
# via --override (workspace)
# via manim
# via manimgl
mapbox-earcut==1.0.1
mapbox-earcut==1.0.2
# via manim
# via manimgl
markdown-it-py==3.0.0
@ -148,18 +155,18 @@ markdown-it-py==3.0.0
markupsafe==2.1.5
# via jinja2
# via nbconvert
matplotlib==3.9.0
matplotlib==3.9.2
# via manimgl
matplotlib-inline==0.1.7
# via ipykernel
# via ipython
mdit-py-plugins==0.4.0
mdit-py-plugins==0.4.1
# via myst-parser
mdurl==0.1.2
# via markdown-it-py
mistune==3.0.2
# via nbconvert
moderngl==5.10.0
moderngl==5.11.1
# via manim
# via manimgl
# via moderngl-window
@ -170,28 +177,27 @@ mpmath==1.3.0
# via sympy
multipledispatch==1.0.0
# via pyrr
myst-parser==2.0.0
myst-parser==4.0.0
# via manim-slides
nbclient==0.10.0
# via nbconvert
nbconvert==7.16.3
nbconvert==7.16.4
# via nbsphinx
nbformat==5.10.4
# via nbclient
# via nbconvert
# via nbsphinx
nbsphinx==0.9.3
nbsphinx==0.9.5
# via manim-slides
nest-asyncio==1.6.0
# via ipykernel
networkx==2.8.8
networkx==3.3
# via manim
nodeenv==1.8.0
nodeenv==1.9.1
# via pre-commit
numpy==1.24.0
# via --override (workspace)
# via contourpy
# via ipython
# via isosurfaces
# via manim
# via manim-slides
@ -199,70 +205,65 @@ numpy==1.24.0
# via mapbox-earcut
# via matplotlib
# via moderngl-window
# via networkx
# via pyrr
# via scipy
packaging==24.0
packaging==24.1
# via ipykernel
# via matplotlib
# via nbconvert
# via pytest
# via qtpy
# via sphinx
pandoc==2.3
pandoc==2.4
# via manim-slides
pandocfilters==1.5.1
# via nbconvert
parso==0.8.4
# via jedi
pexpect==4.9.0
# via ipython
pillow==10.3.0
pillow==10.4.0
# via manim
# via manim-slides
# via manimgl
# via matplotlib
# via moderngl-window
# via python-pptx
platformdirs==4.2.0
platformdirs==4.2.2
# via jupyter-core
# via virtualenv
pluggy==1.4.0
pluggy==1.5.0
# via pytest
# via pytest-qt
plumbum==1.8.2
plumbum==1.8.3
# via pandoc
ply==3.11
# via pandoc
pre-commit==3.7.0
prompt-toolkit==3.0.43
pre-commit==3.8.0
prompt-toolkit==3.0.47
# via ipython
# via questionary
psutil==5.9.8
psutil==6.0.0
# via ipykernel
ptyprocess==0.7.0
# via pexpect
pure-eval==0.2.2
pure-eval==0.2.3
# via stack-data
pycairo==1.26.0
pycairo==1.26.1
# via manim
pydantic==2.7.0
pydantic==2.8.2
# via bump-my-version
# via manim-slides
# via pydantic-extra-types
# via pydantic-settings
pydantic-core==2.18.1
pydantic-core==2.20.1
# via pydantic
pydantic-extra-types==2.6.0
pydantic-extra-types==2.9.0
# via manim-slides
pydantic-settings==2.2.1
pydantic-settings==2.4.0
# via bump-my-version
pydub==0.25.1
# via manim
# via manimgl
pyglet==2.0.15
pyglet==2.0.17
# via moderngl-window
pygments==2.17.2
pygments==2.18.0
# via furo
# via ipython
# via manim
@ -272,24 +273,24 @@ pygments==2.17.2
# via sphinx
pyopengl==3.1.7
# via manimgl
pyparsing==3.1.2
pyparsing==3.1.4
# via matplotlib
pyqt6==6.6.1
pyqt6==6.7.1
# via manim-slides
pyqt6-qt6==6.6.3
pyqt6-qt6==6.7.2
# via pyqt6
pyqt6-sip==13.6.0
pyqt6-sip==13.8.0
# via pyqt6
pyrr==0.10.3
# via moderngl-window
pyside6==6.5.2
pyside6==6.7.2
# via manim-slides
pyside6-addons==6.5.2
pyside6-addons==6.7.2
# via pyside6
pyside6-essentials==6.5.2
pyside6-essentials==6.7.2
# via pyside6
# via pyside6-addons
pytest==8.1.1
pytest==8.3.2
# via manim-slides
# via pytest-cov
# via pytest-env
@ -305,23 +306,26 @@ python-dateutil==2.9.0.post0
# via matplotlib
python-dotenv==1.0.1
# via pydantic-settings
python-pptx==0.6.23
python-pptx==1.0.2
# via manim-slides
pyyaml==6.0.1
pywin32==306
# via jupyter-core
# via plumbum
pyyaml==6.0.2
# via manimgl
# via myst-parser
# via pre-commit
pyzmq==26.0.0
pyzmq==26.2.0
# via ipykernel
# via jupyter-client
qtpy==2.4.1
# via manim-slides
questionary==1.10.0
# via bump-my-version
referencing==0.34.0
referencing==0.35.1
# via jsonschema
# via jsonschema-specifications
requests==2.31.0
requests==2.32.3
# via manim-slides
# via sphinx
rich==13.7.1
@ -330,22 +334,20 @@ rich==13.7.1
# via manim-slides
# via manimgl
# via rich-click
rich-click==1.8.0
rich-click==1.8.3
# via bump-my-version
rpds-py==0.18.0
rpds-py==0.20.0
# via jsonschema
# via referencing
rtoml==0.10.0
rtoml==0.9.0
# via manim-slides
scipy==1.13.0
scipy==1.14.1
# via manim
# via manimgl
screeninfo==0.8.1
# via manim
# via manimgl
setuptools==69.5.1
# via nodeenv
shiboken6==6.5.2
shiboken6==6.7.2
# via pyside6
# via pyside6-addons
# via pyside6-essentials
@ -358,9 +360,9 @@ skia-pathops==0.8.0.post1
# via manimgl
snowballstemmer==2.2.0
# via sphinx
soupsieve==2.5
soupsieve==2.6
# via beautifulsoup4
sphinx==7.3.6
sphinx==8.0.2
# via furo
# via manim-slides
# via myst-parser
@ -371,21 +373,21 @@ sphinx==7.3.6
# via sphinxext-opengraph
sphinx-basic-ng==1.0.0b2
# via furo
sphinx-click==5.1.0
sphinx-click==6.0.0
# via manim-slides
sphinx-copybutton==0.5.2
# via manim-slides
sphinxcontrib-applehelp==1.0.8
sphinxcontrib-applehelp==2.0.0
# via sphinx
sphinxcontrib-devhelp==1.0.6
sphinxcontrib-devhelp==2.0.0
# via sphinx
sphinxcontrib-htmlhelp==2.0.5
sphinxcontrib-htmlhelp==2.1.0
# via sphinx
sphinxcontrib-jsmath==1.0.1
# via sphinx
sphinxcontrib-qthelp==1.0.7
sphinxcontrib-qthelp==2.0.0
# via sphinx
sphinxcontrib-serializinghtml==1.1.10
sphinxcontrib-serializinghtml==2.0.0
# via sphinx
sphinxext-opengraph==0.9.1
# via manim-slides
@ -396,20 +398,20 @@ stack-data==0.6.3
svgelements==1.9.6
# via manim
# via manimgl
sympy==1.12.1
sympy==1.13.2
# via manimgl
tinycss2==1.2.1
tinycss2==1.3.0
# via nbconvert
tomlkit==0.12.4
tomlkit==0.13.2
# via bump-my-version
tornado==6.4
tornado==6.4.1
# via ipykernel
# via jupyter-client
tqdm==4.66.2
tqdm==4.66.5
# via manim
# via manim-slides
# via manimgl
traitlets==5.14.2
traitlets==5.14.3
# via comm
# via ipykernel
# via ipython
@ -420,20 +422,22 @@ traitlets==5.14.2
# via nbconvert
# via nbformat
# via nbsphinx
typing-extensions==4.11.0
typing-extensions==4.12.2
# via ipython
# via manim
# via pydantic
# via pydantic-core
# via python-pptx
# via rich-click
urllib3==2.2.1
urllib3==2.2.2
# via requests
validators==0.28.3
validators==0.33.0
# via manimgl
virtualenv==20.25.3
virtualenv==20.26.3
# via pre-commit
watchdog==2.3.1
watchdog==4.0.2
# via manim
wcmatch==8.5.1
wcmatch==9.0
# via bump-my-version
wcwidth==0.2.13
# via prompt-toolkit

View File

@ -7,27 +7,28 @@
# all-features: true
# with-sources: false
# generate-hashes: false
# universal: false
-e file:.
alabaster==0.7.16
alabaster==1.0.0
# via sphinx
annotated-types==0.6.0
annotated-types==0.7.0
# via pydantic
asttokens==2.4.1
# via stack-data
attrs==23.2.0
attrs==24.2.0
# via jsonschema
# via referencing
av==12.0.0
av==12.3.0
# via manim-slides
babel==2.15.0
babel==2.16.0
# via sphinx
beautifulsoup4==4.12.3
# via furo
# via nbconvert
bleach==6.1.0
# via nbconvert
certifi==2024.2.2
certifi==2024.7.4
# via requests
charset-normalizer==3.3.2
# via requests
@ -41,24 +42,30 @@ click-default-group==1.2.4
# via manim-slides
cloup==3.0.5
# via manim
colorama==0.4.6
# via click
# via ipython
# via pytest
# via sphinx
# via tqdm
colour==0.1.5
# via manimgl
comm==0.2.2
# via ipykernel
contourpy==1.2.1
# via matplotlib
coverage==7.5.4
coverage==7.6.1
# via pytest-cov
cycler==0.12.1
# via matplotlib
debugpy==1.8.2
debugpy==1.8.5
# via ipykernel
decorator==5.1.1
# via ipython
# via manim
defusedxml==0.7.1
# via nbconvert
docutils==0.20.1
docutils==0.21.2
# via manim-slides
# via myst-parser
# via nbsphinx
@ -68,36 +75,36 @@ executing==2.0.1
# via stack-data
fastjsonschema==2.20.0
# via nbformat
fonttools==4.53.0
fonttools==4.53.1
# via matplotlib
furo==2024.5.6
furo==2024.8.6
# via manim-slides
glcontext==2.5.0
glcontext==3.0.0
# via moderngl
idna==3.7
idna==3.8
# via requests
imagesize==1.4.1
# via sphinx
iniconfig==2.0.0
# via pytest
ipykernel==6.29.4
ipykernel==6.29.5
# via manim-slides
ipython==8.18.1
ipython==8.26.0
# via ipykernel
# via manim-slides
# via manimgl
isosurfaces==0.1.0
isosurfaces==0.1.2
# via manim
# via manimgl
jedi==0.19.1
# via ipython
jinja2==3.1.3
jinja2==3.1.4
# via manim-slides
# via myst-parser
# via nbconvert
# via nbsphinx
# via sphinx
jsonschema==4.22.0
jsonschema==4.23.0
# via nbformat
jsonschema-specifications==2023.12.1
# via jsonschema
@ -114,7 +121,7 @@ jupyterlab-pygments==0.3.0
# via nbconvert
kiwisolver==1.4.5
# via matplotlib
lxml==5.2.1
lxml==5.3.0
# via manim-slides
# via python-pptx
manim==0.18.1
@ -125,7 +132,7 @@ manimpango==0.5.0
# via --override (workspace)
# via manim
# via manimgl
mapbox-earcut==1.0.1
mapbox-earcut==1.0.2
# via manim
# via manimgl
markdown-it-py==3.0.0
@ -135,7 +142,7 @@ markdown-it-py==3.0.0
markupsafe==2.1.5
# via jinja2
# via nbconvert
matplotlib==3.9.0
matplotlib==3.9.2
# via manimgl
matplotlib-inline==0.1.7
# via ipykernel
@ -146,7 +153,7 @@ mdurl==0.1.2
# via markdown-it-py
mistune==3.0.2
# via nbconvert
moderngl==5.10.0
moderngl==5.11.1
# via manim
# via manimgl
# via moderngl-window
@ -157,7 +164,7 @@ mpmath==1.3.0
# via sympy
multipledispatch==1.0.0
# via pyrr
myst-parser==3.0.1
myst-parser==4.0.0
# via manim-slides
nbclient==0.10.0
# via nbconvert
@ -167,16 +174,15 @@ nbformat==5.10.4
# via nbclient
# via nbconvert
# via nbsphinx
nbsphinx==0.9.4
nbsphinx==0.9.5
# via manim-slides
nest-asyncio==1.6.0
# via ipykernel
networkx==2.8.8
networkx==3.3
# via manim
numpy==1.24.0
# via --override (workspace)
# via contourpy
# via ipython
# via isosurfaces
# via manim
# via manim-slides
@ -184,25 +190,22 @@ numpy==1.24.0
# via mapbox-earcut
# via matplotlib
# via moderngl-window
# via networkx
# via pyrr
# via scipy
packaging==24.0
packaging==24.1
# via ipykernel
# via matplotlib
# via nbconvert
# via pytest
# via qtpy
# via sphinx
pandoc==2.3
pandoc==2.4
# via manim-slides
pandocfilters==1.5.1
# via nbconvert
parso==0.8.4
# via jedi
pexpect==4.9.0
# via ipython
pillow==10.3.0
pillow==10.4.0
# via manim
# via manim-slides
# via manimgl
@ -218,29 +221,27 @@ plumbum==1.8.3
# via pandoc
ply==3.11
# via pandoc
prompt-toolkit==3.0.43
prompt-toolkit==3.0.47
# via ipython
psutil==6.0.0
# via ipykernel
ptyprocess==0.7.0
# via pexpect
pure-eval==0.2.2
pure-eval==0.2.3
# via stack-data
pycairo==1.26.0
pycairo==1.26.1
# via manim
pydantic==2.7.0
pydantic==2.8.2
# via manim-slides
# via pydantic-extra-types
pydantic-core==2.18.1
pydantic-core==2.20.1
# via pydantic
pydantic-extra-types==2.6.0
pydantic-extra-types==2.9.0
# via manim-slides
pydub==0.25.1
# via manim
# via manimgl
pyglet==2.0.15
pyglet==2.0.17
# via moderngl-window
pygments==2.17.2
pygments==2.18.0
# via furo
# via ipython
# via manim
@ -250,24 +251,24 @@ pygments==2.17.2
# via sphinx
pyopengl==3.1.7
# via manimgl
pyparsing==3.1.2
pyparsing==3.1.4
# via matplotlib
pyqt6==6.6.1
pyqt6==6.7.1
# via manim-slides
pyqt6-qt6==6.6.3
pyqt6-qt6==6.7.2
# via pyqt6
pyqt6-sip==13.6.0
pyqt6-sip==13.8.0
# via pyqt6
pyrr==0.10.3
# via moderngl-window
pyside6==6.5.2
pyside6==6.7.2
# via manim-slides
pyside6-addons==6.5.2
pyside6-addons==6.7.2
# via pyside6
pyside6-essentials==6.5.2
pyside6-essentials==6.7.2
# via pyside6
# via pyside6-addons
pytest==8.2.2
pytest==8.3.2
# via manim-slides
# via pytest-cov
# via pytest-env
@ -281,12 +282,15 @@ pytest-qt==4.4.0
python-dateutil==2.9.0.post0
# via jupyter-client
# via matplotlib
python-pptx==0.6.23
python-pptx==1.0.2
# via manim-slides
pyyaml==6.0.1
pywin32==306
# via jupyter-core
# via plumbum
pyyaml==6.0.2
# via manimgl
# via myst-parser
pyzmq==26.0.3
pyzmq==26.2.0
# via ipykernel
# via jupyter-client
qtpy==2.4.1
@ -294,25 +298,25 @@ qtpy==2.4.1
referencing==0.35.1
# via jsonschema
# via jsonschema-specifications
requests==2.31.0
requests==2.32.3
# via manim-slides
# via sphinx
rich==13.7.1
# via manim
# via manim-slides
# via manimgl
rpds-py==0.18.1
rpds-py==0.20.0
# via jsonschema
# via referencing
rtoml==0.10.0
rtoml==0.9.0
# via manim-slides
scipy==1.13.0
scipy==1.14.1
# via manim
# via manimgl
screeninfo==0.8.1
# via manim
# via manimgl
shiboken6==6.5.2
shiboken6==6.7.2
# via pyside6
# via pyside6-addons
# via pyside6-essentials
@ -325,9 +329,9 @@ skia-pathops==0.8.0.post1
# via manimgl
snowballstemmer==2.2.0
# via sphinx
soupsieve==2.5
soupsieve==2.6
# via beautifulsoup4
sphinx==7.3.7
sphinx==8.0.2
# via furo
# via manim-slides
# via myst-parser
@ -342,17 +346,17 @@ sphinx-click==6.0.0
# via manim-slides
sphinx-copybutton==0.5.2
# via manim-slides
sphinxcontrib-applehelp==1.0.8
sphinxcontrib-applehelp==2.0.0
# via sphinx
sphinxcontrib-devhelp==1.0.6
sphinxcontrib-devhelp==2.0.0
# via sphinx
sphinxcontrib-htmlhelp==2.0.5
sphinxcontrib-htmlhelp==2.1.0
# via sphinx
sphinxcontrib-jsmath==1.0.1
# via sphinx
sphinxcontrib-qthelp==1.0.7
sphinxcontrib-qthelp==2.0.0
# via sphinx
sphinxcontrib-serializinghtml==1.1.10
sphinxcontrib-serializinghtml==2.0.0
# via sphinx
sphinxext-opengraph==0.9.1
# via manim-slides
@ -363,18 +367,18 @@ stack-data==0.6.3
svgelements==1.9.6
# via manim
# via manimgl
sympy==1.12.1
sympy==1.13.2
# via manimgl
tinycss2==1.3.0
# via nbconvert
tornado==6.4.1
# via ipykernel
# via jupyter-client
tqdm==4.66.2
tqdm==4.66.5
# via manim
# via manim-slides
# via manimgl
traitlets==5.14.2
traitlets==5.14.3
# via comm
# via ipykernel
# via ipython
@ -385,15 +389,17 @@ traitlets==5.14.2
# via nbconvert
# via nbformat
# via nbsphinx
typing-extensions==4.11.0
typing-extensions==4.12.2
# via ipython
# via manim
# via pydantic
# via pydantic-core
urllib3==2.2.1
# via python-pptx
urllib3==2.2.2
# via requests
validators==0.28.3
validators==0.33.0
# via manimgl
watchdog==2.3.1
watchdog==4.0.2
# via manim
wcwidth==0.2.13
# via prompt-toolkit