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) [#429](https://github.com/jeertmans/manim-slides/pull/429)
- Fixed whitespace issue in default RevealJS template. - Fixed whitespace issue in default RevealJS template.
[#442](https://github.com/jeertmans/manim-slides/pull/442) [#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)= (unreleased-removed)=
### Removed ### Removed

View File

@ -113,10 +113,7 @@ using optional dependencies:
and does not work with ManimGL; and does not work with ManimGL;
- `manim` and `manimgl`, for installing the corresponding - `manim` and `manimgl`, for installing the corresponding
dependencies; dependencies;
- `pyqt6` to include PyQt6 Qt bindings. Those bindings are available - `pyqt6` to include PyQt6 Qt bindings;
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-full` to include `full` and `pyqt6`; - `pyqt6-full` to include `full` and `pyqt6`;
- `pyside6` to include PySide6 Qt bindings. Those bindings are available - `pyside6` to include PySide6 Qt bindings. Those bindings are available
on most platforms and Python version, except on Python 3.12[^2]; 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 ..config import Config, PresentationConfig
from ..logger import logger 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() @click.command()
@folder_path_option @folder_path_option
@ -302,8 +285,6 @@ def present(
if start_at[1]: if start_at[1]:
start_at_slide_number = start_at[1] start_at_slide_number = start_at[1]
warn_if_non_desirable_pyside6_version()
from qtpy.QtCore import Qt from qtpy.QtCore import Qt
from qtpy.QtGui import QScreen from qtpy.QtGui import QScreen

View File

@ -226,6 +226,8 @@ class Player(QMainWindow): # type: ignore[misc]
self.icon = QIcon(":/icon.png") self.icon = QIcon(":/icon.png")
self.setWindowIcon(self.icon) self.setWindowIcon(self.icon)
self.frame = QVideoFrame()
self.audio_output = QAudioOutput() self.audio_output = QAudioOutput()
self.video_widget = QVideoWidget() self.video_widget = QVideoWidget()
self.video_sink = self.video_widget.videoSink() 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.presentation_changed.connect(self.presentation_changed_callback)
self.slide_changed.connect(self.slide_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( self.info = Info(
full_screen=full_screen, full_screen=full_screen,
aspect_ratio_mode=aspect_ratio_mode, 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.close_event.connect(self.closeEvent)
self.info.key_press_event.connect(self.keyPressEvent) 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 self.hide_info_window = hide_info_window
# Connecting key callbacks # Connecting key callbacks
@ -555,6 +545,34 @@ class Player(QMainWindow): # type: ignore[misc]
else: else:
self.setCursor(Qt.BlankCursor) 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 def closeEvent(self, event: QCloseEvent) -> None: # noqa: N802
self.close() self.close()

View File

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

View File

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

View File

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