<!DOCTYPE html>
< html class = "writer-html5" lang = "en" >
< head >
< meta charset = "utf-8" / > < meta name = "generator" content = "Docutils 0.17.1: http://docutils.sourceforge.net/" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" / >
< title > pyTermTk - Signal & Slots — pyTermTk 0.2.0a documentation< / title >
< link rel = "stylesheet" href = "../_static/pygments.css" type = "text/css" / >
< link rel = "stylesheet" href = "../_static/css/theme.css" type = "text/css" / >
< link rel = "stylesheet" href = "../_static/theme_overrides.css" type = "text/css" / >
< link rel = "stylesheet" href = "../_static/ttk.css" type = "text/css" / >
<!-- [if lt IE 9]>
< script src = "../_static/js/html5shiv.min.js" > < / script >
<![endif]-->
< script data-url_root = "../" id = "documentation_options" src = "../_static/documentation_options.js" > < / script >
< script src = "../_static/jquery.js" > < / script >
< script src = "../_static/underscore.js" > < / script >
< script src = "../_static/_sphinx_javascript_frameworks_compat.js" > < / script >
< script src = "../_static/doctools.js" > < / script >
< script src = "../_static/js/theme.js" > < / script >
< link rel = "index" title = "Index" href = "../genindex.html" / >
< link rel = "search" title = "Search" href = "../search.html" / >
< link rel = "next" title = "pyTermTk - Logging" href = "004-logging.html" / >
< link rel = "prev" title = "pyTermTk - Layouts" href = "002-layout.html" / >
< / head >
< body class = "wy-body-for-nav" >
< div class = "wy-grid-for-nav" >
< nav data-toggle = "wy-nav-shift" class = "wy-nav-side" >
< div class = "wy-side-scroll" >
< div class = "wy-side-nav-search" >
< a href = "../index.html" class = "icon icon-home" > pyTermTk
< / a >
< div role = "search" >
< form id = "rtd-search-form" class = "wy-form" action = "../search.html" method = "get" >
< input type = "text" name = "q" placeholder = "Search docs" / >
< input type = "hidden" name = "check_keywords" value = "yes" / >
< input type = "hidden" name = "area" value = "default" / >
< / form >
< / div >
< / div > < div class = "wy-menu wy-menu-vertical" data-spy = "affix" role = "navigation" aria-label = "Navigation menu" >
< p class = "caption" role = "heading" > < span class = "caption-text" > Tutorials< / span > < / p >
< ul class = "current" >
< li class = "toctree-l1" > < a class = "reference internal" href = "001-helloworld.html" > pyTermTk - Hello World< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "002-layout.html" > pyTermTk - Layouts< / a > < / li >
< li class = "toctree-l1 current" > < a class = "current reference internal" href = "#" > pyTermTk - Signal & Slots< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "#intro" > Intro< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "#signal-and-slots" > Signal and Slots< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "#examples" > Examples< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "#example-1-basic-signal-slots" > Example 1 - basic signal slots< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#example-2-use-widgets-signals-and-slots" > Example 2 - Use widgets signals and slots< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "004-logging.html" > pyTermTk - Logging< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "005-calculator.html" > pyTermTk - Your first Calculator< / a > < / li >
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > API Reference< / span > < / p >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkAbstract.html" > TermTk.TTkAbstract< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkCore.html" > TermTk.TTkCore< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkCore.TTkTerm.html" > TermTk.TTkCore.TTkTerm< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkGui.html" > TermTk.TTkGui< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkLayouts.html" > TermTk.TTkLayouts< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkTemplates.html" > TermTk.TTkTemplates< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkTestWidgets.html" > TermTk.TTkTestWidgets< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkTheme.html" > TermTk.TTkTheme< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkTypes.html" > TermTk.TTkTypes< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkWidgets.html" > TermTk.TTkWidgets< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkWidgets.TTkModelView.html" > TermTk.TTkWidgets.TTkModelView< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../autogen.TermTk/TermTk.TTkWidgets.TTkPickers.html" > TermTk.TTkWidgets.TTkPickers< / a > < / li >
< / ul >
< / div >
< / div >
< / nav >
< section data-toggle = "wy-nav-shift" class = "wy-nav-content-wrap" > < nav class = "wy-nav-top" aria-label = "Mobile navigation menu" >
< i data-toggle = "wy-nav-top" class = "fa fa-bars" > < / i >
< a href = "../index.html" > pyTermTk< / a >
< / nav >
< div class = "wy-nav-content" >
< div class = "rst-content" >
< div role = "navigation" aria-label = "Page navigation" >
< ul class = "wy-breadcrumbs" >
< li > < a href = "../index.html" class = "icon icon-home" > < / a > » < / li >
< li > pyTermTk - Signal & Slots< / li >
< li class = "wy-breadcrumbs-aside" >
< a href = "../_sources/tutorial/003-signalslots.rst.txt" rel = "nofollow" > View page source< / a >
< / li >
< / ul >
< hr / >
< / div >
< div role = "main" class = "document" itemscope = "itemscope" itemtype = "http://schema.org/Article" >
< div itemprop = "articleBody" >
< section id = "pytermtk-signal-slots" >
< h1 > < a class = "reference external" href = "https://github.com/ceccopierangiolieugenio/pyTermTk" > pyTermTk< / a > - Signal & Slots< a class = "headerlink" href = "#pytermtk-signal-slots" title = "Permalink to this heading" > < / a > < / h1 >
< p > Signals and slots are used for communication between objects.< / p >
< section id = "intro" >
< h2 > Intro< a class = "headerlink" href = "#intro" title = "Permalink to this heading" > < / a > < / h2 >
< div class = "line-block" >
< div class = "line" > The < a class = "reference external" href = "https://ceccopierangiolieugenio.github.io/pyTermTk/autogen.TermTk/TermTk.TTkCore.signal.html" > TermTk Signal& Slots< / a > is more than heavily inspired by < a class = "reference external" href = "https://www.riverbankcomputing.com/static/Docs/PyQt5/signals_slots.html" > Qt5 Signal& Slots< / a > < / div >
< div class = "line" > < a class = "reference external" href = "https://doc.qt.io/qt-5/signalsandslots.html" > https://doc.qt.io/qt-5/signalsandslots.html< / a > < / div >
< / div >
< div class = "line-block" >
< div class = "line" > In GUI programming, when we change one widget, we often want another widget to be notified.< / div >
< div class = "line" > More generally, we want objects of any kind to be able to communicate with one another.< / div >
< div class = "line" > For example, if a user clicks a Close button, we probably want the window’s close() function to be called.< / div >
< / div >
< / section >
< section id = "signal-and-slots" >
< h2 > Signal and Slots< a class = "headerlink" href = "#signal-and-slots" title = "Permalink to this heading" > < / a > < / h2 >
< div class = "line-block" >
< div class = "line" > A signal is emitted when a particular event occurs.< / div >
< div class = "line" > A slot is a function that is called in response to a particular signal.< / div >
< div class = "line" > < a class = "reference external" href = "https://github.com/ceccopierangiolieugenio/pyTermTk" > TermTk< / a > ’s < a class = "reference external" href = "https://ceccopierangiolieugenio.github.io/pyTermTk/autogen.TermTk/TermTk.TTkWidgets.html" > TTkWidgets< / a > have many predefined signals/slots, but it is possible to subclass any < a class = "reference external" href = "https://ceccopierangiolieugenio.github.io/pyTermTk/autogen.TermTk/TermTk.TTkWidgets.html" > TTkWidgets< / a > and add our own signals/slots to them.< / div >
< / div >
< img alt = "https://ceccopierangiolieugenio.github.io/pyTermTk/_images/Signal.Slots.001.svg" src = "https://ceccopierangiolieugenio.github.io/pyTermTk/_images/Signal.Slots.001.svg" / > < / section >
< section id = "examples" >
< h2 > Examples< a class = "headerlink" href = "#examples" title = "Permalink to this heading" > < / a > < / h2 >
< section id = "example-1-basic-signal-slots" >
< h3 > Example 1 - basic signal slots< a class = "headerlink" href = "#example-1-basic-signal-slots" title = "Permalink to this heading" > < / a > < / h3 >
< p > From < a class = "reference external" href = "https://github.com/ceccopierangiolieugenio/pyTermTk/blob/main/tutorial/signalslots/example1.basic.signalslots.py" > example1.basic.signalslots.py< / a > < / p >
< div class = "highlight-python notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > import< / span > < span class = "nn" > TermTk< / span > < span class = "k" > as< / span > < span class = "nn" > ttk< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLog< / span > < span class = "o" > .< / span > < span class = "n" > use_default_stdout_logging< / span > < span class = "p" > ()< / span >
< span class = "c1" > # define 2 signals with different signatures< / span >
< span class = "n" > signal< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > pyTTkSignal< / span > < span class = "p" > ()< / span >
< span class = "n" > otherSignal< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > pyTTkSignal< / span > < span class = "p" > (< / span > < span class = "nb" > int< / span > < span class = "p" > )< / span >
< span class = "c1" > # Define a slot with no input as signature< / span >
< span class = "nd" > @ttk< / span > < span class = "o" > .< / span > < span class = "n" > pyTTkSlot< / span > < span class = "p" > ()< / span >
< span class = "k" > def< / span > < span class = "nf" > slot< / span > < span class = "p" > ():< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLog< / span > < span class = "o" > .< / span > < span class = "n" > debug< / span > < span class = "p" > (< / span > < span class = "s2" > " Received a simple signal" < / span > < span class = "p" > )< / span >
< span class = "c1" > # Define 2 slots with " int" as input signature< / span >
< span class = "nd" > @ttk< / span > < span class = "o" > .< / span > < span class = "n" > pyTTkSlot< / span > < span class = "p" > (< / span > < span class = "nb" > int< / span > < span class = "p" > )< / span >
< span class = "k" > def< / span > < span class = "nf" > otherSlot< / span > < span class = "p" > (< / span > < span class = "n" > val< / span > < span class = "p" > ):< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLog< / span > < span class = "o" > .< / span > < span class = "n" > debug< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " [otherSlot] Received a valued signal, val:< / span > < span class = "si" > {< / span > < span class = "n" > val< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span > < span class = "p" > )< / span >
< span class = "nd" > @ttk< / span > < span class = "o" > .< / span > < span class = "n" > pyTTkSlot< / span > < span class = "p" > (< / span > < span class = "nb" > int< / span > < span class = "p" > )< / span >
< span class = "k" > def< / span > < span class = "nf" > anotherSlot< / span > < span class = "p" > (< / span > < span class = "n" > val< / span > < span class = "p" > ):< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLog< / span > < span class = "o" > .< / span > < span class = "n" > debug< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " [anootherSlot] Received a valued signal, val:< / span > < span class = "si" > {< / span > < span class = "n" > val< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span > < span class = "p" > )< / span >
< span class = "c1" > # connect the signals to the proper slot< / span >
< span class = "n" > signal< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "p" > (< / span > < span class = "n" > slot< / span > < span class = "p" > )< / span >
< span class = "n" > otherSignal< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "p" > (< / span > < span class = "n" > otherSlot< / span > < span class = "p" > )< / span >
< span class = "n" > otherSignal< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "p" > (< / span > < span class = "n" > anotherSlot< / span > < span class = "p" > )< / span >
< span class = "c1" > # Test the signals< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLog< / span > < span class = "o" > .< / span > < span class = "n" > debug< / span > < span class = "p" > (< / span > < span class = "s2" > " Emit a simple signal" < / span > < span class = "p" > )< / span >
< span class = "n" > signal< / span > < span class = "o" > .< / span > < span class = "n" > emit< / span > < span class = "p" > ()< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLog< / span > < span class = "o" > .< / span > < span class = "n" > debug< / span > < span class = "p" > (< / span > < span class = "s2" > " Emit a valued signal" < / span > < span class = "p" > )< / span >
< span class = "n" > otherSignal< / span > < span class = "o" > .< / span > < span class = "n" > emit< / span > < span class = "p" > (< / span > < span class = "mi" > 123< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< p > The above code produces the following output< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > $ tutorial/signalslots/example1.basic.signalslots.py
DEBUG:(MainThread) tutorial/signalslots/example1.basic.signalslots.py:54 Emit a simple signal
DEBUG:(MainThread) tutorial/signalslots/example1.basic.signalslots.py:37 Received a simple signal
DEBUG:(MainThread) tutorial/signalslots/example1.basic.signalslots.py:56 Emit a valued signal
DEBUG:(MainThread) tutorial/signalslots/example1.basic.signalslots.py:42 [otherSlot] Received a valued signal, val:123
DEBUG:(MainThread) tutorial/signalslots/example1.basic.signalslots.py:45 [anootherSlot] Received a valued signal, val:123
< / pre > < / div >
< / div >
< / section >
< section id = "example-2-use-widgets-signals-and-slots" >
< h3 > Example 2 - Use widgets signals and slots< a class = "headerlink" href = "#example-2-use-widgets-signals-and-slots" title = "Permalink to this heading" > < / a > < / h3 >
< p > From < a class = "reference external" href = "https://github.com/ceccopierangiolieugenio/pyTermTk/blob/main/tutorial/signalslots/example2.widgets.signalslots.py" > example2.widgets.signalslots.py< / a > < / p >
< div class = "highlight-python notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > import< / span > < span class = "nn" > TermTk< / span > < span class = "k" > as< / span > < span class = "nn" > ttk< / span >
< span class = "n" > root< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTk< / span > < span class = "p" > ()< / span >
< span class = "c1" > # Create a window with a logviewer< / span >
< span class = "n" > logWin< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkWindow< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "o" > =< / span > < span class = "n" > root< / span > < span class = "p" > ,< / span > < span class = "n" > pos< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "mi" > 10< / span > < span class = "p" > ,< / span > < span class = "mi" > 2< / span > < span class = "p" > ),< / span > < span class = "n" > size< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "mi" > 80< / span > < span class = "p" > ,< / span > < span class = "mi" > 20< / span > < span class = "p" > ),< / span > < span class = "n" > title< / span > < span class = "o" > =< / span > < span class = "s2" > " LogViewer Window" < / span > < span class = "p" > ,< / span > < span class = "n" > border< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > ,< / span > < span class = "n" > layout< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkVBoxLayout< / span > < span class = "p" > ())< / span >
< span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkLogViewer< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "o" > =< / span > < span class = "n" > logWin< / span > < span class = "p" > )< / span >
< span class = "c1" > # Create 2 buttons< / span >
< span class = "n" > btnShow< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkButton< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "o" > =< / span > < span class = "n" > root< / span > < span class = "p" > ,< / span > < span class = "n" > text< / span > < span class = "o" > =< / span > < span class = "s2" > " Show" < / span > < span class = "p" > ,< / span > < span class = "n" > pos< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "mi" > 0< / span > < span class = "p" > ),< / span > < span class = "n" > size< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "mi" > 10< / span > < span class = "p" > ,< / span > < span class = "mi" > 3< / span > < span class = "p" > ),< / span > < span class = "n" > border< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< span class = "n" > btnHide< / span > < span class = "o" > =< / span > < span class = "n" > ttk< / span > < span class = "o" > .< / span > < span class = "n" > TTkButton< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "o" > =< / span > < span class = "n" > root< / span > < span class = "p" > ,< / span > < span class = "n" > text< / span > < span class = "o" > =< / span > < span class = "s2" > " Hide" < / span > < span class = "p" > ,< / span > < span class = "n" > pos< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "mi" > 3< / span > < span class = "p" > ),< / span > < span class = "n" > size< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "mi" > 10< / span > < span class = "p" > ,< / span > < span class = "mi" > 3< / span > < span class = "p" > ),< / span > < span class = "n" > border< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< span class = "c1" > # Connect the btnShow' s " clicked" signal with the window' s " show" slot< / span >
< span class = "n" > btnShow< / span > < span class = "o" > .< / span > < span class = "n" > clicked< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "p" > (< / span > < span class = "n" > logWin< / span > < span class = "o" > .< / span > < span class = "n" > show< / span > < span class = "p" > )< / span >
< span class = "c1" > # Connect the btnHide' s " clicked" signal with the window' s " hide" slot< / span >
< span class = "n" > btnHide< / span > < span class = "o" > .< / span > < span class = "n" > clicked< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "p" > (< / span > < span class = "n" > logWin< / span > < span class = "o" > .< / span > < span class = "n" > hide< / span > < span class = "p" > )< / span >
< span class = "n" > root< / span > < span class = "o" > .< / span > < span class = "n" > mainloop< / span > < span class = "p" > ()< / span >
< / pre > < / div >
< / div >
< p > A screenshot is totally useless for this example but for the sack of completemess, the above code produces the following output< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > ┌────────┐
│ Show │
╘════════╛╔══════════════════════════════════════════════════════════════════════════════╗
┌────────┐║ LogViewer Window ║
│ Hide │╟──────────────────────────────────────────────────────────────────────────────╢
╘════════╛║ ║
║DEBUG: _/.venv/lib/python3.8/site-packages/TermTk/TTkCore/ttk.py:70 Starting M║
║DEBUG: _/.venv/lib/python3.8/site-packages/TermTk/TTkCore/ttk.py:80 Signal Eve║
║DEBUG: _/.venv/lib/python3.8/site-packages/TermTk/TTkCore/ttk.py:65 fps: 33 ║
║DEBUG: _/.venv/lib/python3.8/site-packages/TermTk/TTkCore/ttk.py:65 fps: 34 ║
║DEBUG: _/.venv/lib/python3.8/site-packages/TermTk/TTkCore/ttk.py:65 fps: 34 ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║◀▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┄┄┄┄┄┄┄┄┄┄┄▶║
╚══════════════════════════════════════════════════════════════════════════════╝
< / pre > < / div >
< / div >
< / section >
< / section >
< / section >
< / div >
< / div >
< footer > < div class = "rst-footer-buttons" role = "navigation" aria-label = "Footer" >
< a href = "002-layout.html" class = "btn btn-neutral float-left" title = "pyTermTk - Layouts" accesskey = "p" rel = "prev" > < span class = "fa fa-arrow-circle-left" aria-hidden = "true" > < / span > Previous< / a >
< a href = "004-logging.html" class = "btn btn-neutral float-right" title = "pyTermTk - Logging" accesskey = "n" rel = "next" > Next < span class = "fa fa-arrow-circle-right" aria-hidden = "true" > < / span > < / a >
< / div >
< hr / >
< div role = "contentinfo" >
< p > © Copyright 2021, Eugenio Parodi.< / p >
< / div >
Built with < a href = "https://www.sphinx-doc.org/" > Sphinx< / a > using a
< a href = "https://github.com/readthedocs/sphinx_rtd_theme" > theme< / a >
provided by < a href = "https://readthedocs.org" > Read the Docs< / a > .
< / footer >
< / div >
< / div >
< / section >
< / div >
< script >
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
< / script >
< / body >
< / html >