## 2019年1月24日木曜日

### 数学 - Python - HITCHIN' UP YOUR PYTHON WAGON - DRAWING POLYGONS WITH THE TURTLE MODULE(moving, changing directions(forward method, right method))

Math Adventures with Python: An Illustrated Guide to Exploring Math with Code (Peter Farrell(著)、No Starch Press)のPART Ⅰ(HITCHIN' UP YOUR PYTHON WAGON)、1(DRAWING POLYGONS WITH THE TURTLE MODULE)、EXERCISE1-1(SQUARE DANCE)の解答を求めてみる。

turtleモジュールの使用にちょっとつまずく。(環境はmacOS、python3のインストール方法はMacPorts)

```\$ ipython
Python 3.7.2 (default, Dec 30 2018, 08:55:50)
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import turtle
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-ab23d5c8f022> in <module>
----> 1 import turtle

/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py in <module>
105 # print(_ver)
106
--> 107 import tkinter as TK
108 import types
109 import math

/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py in <module>
34 import sys
35
---> 36 import _tkinter # If this fails your Python may not be configured for Tk
37 TclError = _tkinter.TclError
38 from tkinter.constants import *

ModuleNotFoundError: No module named '_tkinter'
```

ということで、tkinterをmacportsで探してインストール。

```\$ port search tkinter
py-tkinter @2.4.6_2 (python, graphics)
Python bindings to the Tk widget set

py26-tkinter @2.6.9 (python, graphics)
Python bindings to the Tk widget set

py27-tkinter @2.7.15 (python, graphics)
Python bindings to the Tk widget set

py31-tkinter @2.5.6_1 (python)
Obsolete port, replaced by py34-tkinter

py32-tkinter @3.2.6_2 (python, graphics)
Python bindings to the Tk widget set

py33-tkinter @3.3.7_2 (python, graphics)
Python bindings to the Tk widget set

py34-tkinter @3.4.9 (python, graphics)
Python bindings to the Tk widget set

py35-tkinter @3.5.6 (python, graphics)
Python bindings to the Tk widget set

py36-tkinter @3.6.8 (python, graphics)
Python bindings to the Tk widget set

py37-tkinter @3.7.2 (python, graphics)
Python bindings to the Tk widget set

pypy-tkinter @6.0.0 (python, graphics)
PyPy bindings to the Tk widget set

pypy3-tkinter @6.0.0 (python, graphics)
PyPy bindings to the Tk widget set

Found 12 ports.
\$ sudo port install py37-tkinter
...
\$
```

python3.7を使用してるからpy37-tkinterをインストール。インストール時にtkも必要だった。これで大丈夫かと思ったら再びエラー。

```TclError: couldn't connect to display "[ここはコンピューター名].local"
```

py37-tkinterインストール時に依存関係でインストールしたtkのvariantsを調べる。

```\$ port variants tk
tk has the variants:
quartz: Enable native macOS graphics support
* conflicts with x11
universal: Build for multiple architectures
[+]x11: Enable X11 support
* conflicts with quartz
\$
```

tkinterインストール時に、macOSの標準のGUIの描画コアエンジンquartzではなくx11(X Windows System)がデフォルトでインストールされるみたい。x11(X Window System)をインストールした記憶がなかったし(もしかしたら他のソフトの依存関係でインストールしたかも)、quartzに変更すればいいのかもと思い、quartzの方をインストール。x11はquartzと衝突するみたいだし、macOSだからせっかくならquartzを使いたいから削除。

```\$ sudo port uninstall tk
...
\$ sudo port install tk +quartz
...
\$
```

これで動いて問題解決した。ということで本題に。

コード

Python 3

```#!/usr/bin/env python3
import time
import turtle

# おまけ
turtle.shape('turtle')

turtle.forward(200)
turtle.right(90)
turtle.forward(200)
turtle.right(90)
turtle.forward(200)
turtle.right(90)
turtle.forward(200)

# すぐにWindowが閉じないように
time.sleep(10)
```

```\$ ipython
Python 3.7.2 (default, Dec 30 2018, 08:55:50)
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import turtle
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-ab23d5c8f022> in <module>
----> 1 import turtle

/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py in <module>
105 # print(_ver)
106
--> 107 import tkinter as TK
108 import types
109 import math

/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py in <module>
34 import sys
35
---> 36 import _tkinter # If this fails your Python may not be configured for Tk
37 TclError = _tkinter.TclError
38 from tkinter.constants import *

ModuleNotFoundError: No module named '_tkinter'
```