# Python

### matplotlib: no window

#### The problem

No window is opened when a script is run from a command line. Running the script in an interactive IDE is fine.

#### What happens

The module `matplotlib` closes all windows when unloaded. This happens immediately after the script terminates if it is run from a command line. When run inside a IDE, then the module stays loaded, keeping windows opened.

#### How to fix

A quick solution is wait for an input from a user at the end of the script. The following code, when added at the end of the script, opens an extra window asking to press any key:

```python
ctrlWindow = matplotlib.pyplot.figure(figsize=(5, 1.5))

ctrlWindow.text(0.5, 0.5, "Press any key to close\nwhile this window is active.", ha="center", va="center", size=16)

ctrlWindow.show()

while not mathplotlib.pyplot.waitforbuttonpress(): pass
```

The function `waitforbuttonpress()` waits for a mouse click or a key being pressed and returns respectively `False` or `True`. The loop makes it sure that the program exists only in the second situation, so that you can interact with the windows using your mouse.

**Note:** the program stops only when a key is pressed while the extra window is active. This allows to interact with other windows without limitation.

### ngsolve.webgui.Draw() does not show a picture

#### The problem

The command `Draw(...)` prints `BaseWebGuiScene` instead of showing a graphics

#### What happens

The WebGUI extension used by NGSolve has not been integrated with Jupyter, so that the notebook does not know what to do with them.

#### How to solve

Install the WebGUI extension with the following commands:

```

pip3 install webgui_jupyter_widgets
jupyter nbextension install --user --py widgetsnbextension
jupyter nbextension enable --user --py widgetsnbextension
jupyter nbextension install --user --py webgui_jupyter_widgets
jupyter nbextension enable --user --py webgui_jupyter_widgets

```

### ngsolve/netgen: RuntimeError: std::bad\_cast

#### The problem

Importing `netgen.gui` opens a separate NGSolve window. After the window is closed, any Python code using ngsolve ends with `RuntimeError: std::bad_cast`.

#### What happens

NGSolve is not written entirely in Python, but instead it delegates computation to external libraries written in C/C++. In order for this to work, netgen.gui loads the libraries in a separate window and then it communicates with it. Once the window is closed, the libraries are no longer in the memory and ngsolve/netgen functions fail to access them.

#### How to solve

Keep the window opened by netgen.gui opened all the time. In case the window was closed, please reopen it with

```python
netgen.gui.StartGUI()
```

**Note**: the ngsolve libraries should be loaded in a background without opening the window. Currently we are not aware why this is not the case.