Jupyter Notebookでwxpython [Mac]

# はじめに
wxpythonを用いたアプリケーション開発に携わることになり，Jupyter Notebookを用いて進めようと思ったが環境構築に少し手間取ったのでメモ．
**Anacondaを入れ終わった直後の状態からJupyter NoteBook上でwxpythonを使えるようになるまで**をまとめる．

# 実行環境
Mac OS High Sierra 10.13.3

# Anacondaで仮想環境を構築する
まずはwxpythonを使用するための仮想環境を作る.

```bash:conda-create
$ conda create -n wxenv python=3.6 anaconda
$ conda info -e
wxenv                    /Users/username/anaconda3/envs/wxenv
root                  *  /Users/username/anaconda3
```
`conda info -e`コマンドで仮想環境が作られているか確認できる．

# wxpythonをインストールする
構築した仮想環境に入る．

```bash:conda-activate
$ source activate wxenv
```

仮想環境から抜けるには`deactivate`コマンドを用いる．

```bash:conda-deactivate
(wxenv)$ source deactivate
```

仮想環境にwxpythonをインストールする．

```bash:install-wxpython
(wxenv)$ conda install wxpython
```

# Jupyterのカーネルを作成する
この時点でJupyter Notebookにおいてwxpythonを用いたコードを実行すると以下のエラーが出る．

```bash:error-message
This program needs access to the screen. Please run with a Framework build of python, and only when you are logged in on the main display of your Mac.
```
この問題を解決するには`pythonw`コマンドを用いればいいらしい．
[Please run with 'pythonw', not 'python' — cannot make plots in python/ipython from cmd line OSX](https://stackoverflow.com/questions/23899782/please-run-with-pythonw-not-python-cannot-make-plots-in-python-ipython-f)

`pythonw`を用いるカーネルを作成して実行することとする．

## カーネルの作成
kernel作成については複数の手段が紹介されている．
以下のサイトを基に作成した．
[Jupyter上でkernel切り替えをしてもうまく機能しない場合の解決方法](https://qiita.com/wac2/items/9d3961e386714b67f732)


`jupyter kernelspec list`コマンドで使用できるカーネルを確認できる．

```bash:kernel-list
(wxenv)$ jupyter kernelspec list
Available kernels:
  python3     /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/python3
```

カーネルを追加する．

```bash:create-kernel
(wxenv)$ conda install notebook ipykernel
(wxenv)$ ipython kernel install --user --name wxpython --display-name wxpython
Installed kernelspec wxpython in /Users/username/Library/Jupyter/kernels/wxpython
```
`--name NAME`で名前を指定しないと既存のPython3のkernelが上書きされるので注意．
`--display-name DISPLAY-NAME`でJupyter Notebook上での表記を変更できる．

カーネルが追加されたか確認．

```bash:kernel-list2
(wxenv)$ jupyter kernelspec list
Available kernels:
  python3     /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/python3
  wxpython    /Users/username/Library/Jupyter/kernels/wxpython
```

既存のカーネルの保存場所と異なる場所にwxpythonが保存されている．
仮想環境内でしか使わないので既存のカーネルの場所と同じ場所に移す．

```bash:kernel-list2
(wxenv)$ mv /Users/username/Library/Jupyter/kernels/wxpython /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/wxpython

(wxenv)$ jupyter kernelspec list
Available kernels:
  python3     /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/python3
  wxpython    /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/wxpython
```

既存のカーネルはそのフォルダを消去すれば消える．

```bash:remove-kernel
(wxenv)$ jupyter kernelspec list
Available kernels:
  python3     /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/python3
  wxpython    /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/wxpython

(wxenv)$ rm -r /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/wxpython
(wxenv)$ jupyter kernelspec list
Available kernels:
  python3     /Users/username/anaconda3/envs/wxenv/share/jupyter/kernels/python3
```

## コマンドの変更（python→pythonw）
カーネルで用いるコマンドはカーネルが保存されているフォルダ内のkernel.jsonに書かれている．

```json:kernel.json
{
 "argv": [
  "/Users/username/anaconda3/envs/wxenv/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "wxpython",
 "language": "python"
}
```

ファイル内の`/Users/username/anaconda3/envs/wxenv/bin/python`を`/Users/username/anaconda3/envs/wxenv/bin/pythonw`に書き換えて保存．
これでwxpythonを使用できるようになった．

# テスト
Jupyter Notebookを開き，kernelを変更．

<img width="1157" alt="スクリーンショット 2018-03-30 15.20.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/167418/49ccd04e-339c-6af0-e811-d05392a3dc37.png">

以下のサンプルコードを実行

```python:sample-code
import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'testframe')
frame.Show()

application.MainLoop()
```

testframeという名前のウィンドウが出てきたらOK．
<img width="1161" alt="スクリーンショット 2018-03-30 15.22.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/167418/18e12562-a552-d641-1788-c6d6f428a386.png">


# さいごに
一応，Jupyter Notebookでwxpythonを用いることができるようになったので作業が捗るはず．
（もっといい方法があったり，この方法に問題があるかもしれない）


# 参照
[Please run with 'pythonw', not 'python' — cannot make plots in python/ipython from cmd line OSX](https://stackoverflow.com/questions/23899782/please-run-with-pythonw-not-python-cannot-make-plots-in-python-ipython-f)
[Jupyter上でkernel切り替えをしてもうまく機能しない場合の解決方法](https://qiita.com/wac2/items/9d3961e386714b67f732)
[Jupyter Notebookをインストール・設定して勉強ノート作成環境をつくる [Mac]](https://qiita.com/sasaki77/items/bfa53828c973ba46e34d)
[How to use wxpython in an ipython notebook or console](https://stackoverflow.com/questions/30743683/how-to-use-wxpython-in-an-ipython-notebook-or-console)