先日は、
Pythonについてかきました、PythonをWINDOWSでインストールすると、IDLEが付属するので、コーディングがしやすくなりますが、試してみる場合だと、ライブラリもそろっているJupiterを触ってみてからスタートする方法もあります。
Pythonのインストール方法としては公式からダウンロードしてインストールすることになりますが、統合環境をインストールすることで最初からライブラリを使える環境を作ることもできます。
ANACONDA
- 200人未満の法人
- 非商用利用
んの中で触れていますが、R言語はデータの取扱いとグラフにする処理がかなり簡単なので、意外と覚えやすい言語かなと思います。こうした物がAnacondaをインストールするだけで利用できるようになっています。
コーディング
コーディングをする場合、Sypderだけでもインストールは可能なので、Linux環境だとリポリトジにSypderだけが存在しているので、それをインストールする方法もあります。
ただし、Ubuntu環境の場合、TkがインストールされていないのでTkを使った処理の大半のことができません。
GUI環境
プログラミング言語によって仕様が異なりますが、基本的にCLIでCUIの動作になっているものは、外部のをジェットを用意してから使用することになっています。
WINDOWS版のPythonもIDLEをインストールしない状態だとtkが使用できませんから、tkと依存関係にある標準ライブラリを使用することができません。
この辺りは、他の言語で何かしらのウィジェットを使ってコーディングを行う場合も同様なので、ウィジェット自体がない場合には動作しませんし、存在しないライブラリの読み込みをした時のようにエラーが出ます。
Pythonでtknterを使ってエラーが出る場合、tkinterが使えないという意味合になっているので、tkinterの問題のように見えますが、実際にはそうではなく、PC環境内にPythonで使用できるtk環境が存在しないことで発生した問題になります。
Linuxの場合、
- Python 2.7系の場合 : python-tk
- Python 3.x系の場合 : python3-tk
- Python 2.7系 : sudo apt install python-tk
- Python 3.x系 : sudo apt-get install python3-tk
のようにしてインストールをするとtkを使用した標準ライブラリが使用できるようになります。
基本的にmatplotlibのグラフ表示ができている場合、tkは入っているはずなんですが、tk環境の有無を調べる場合だと、tkinterを使うコードを書いてみて実行するとtkがない場合には、最初の行のimport部分でエラーが発生します。
この辺りは、spyderでも同じなので、tkがない環境でSpyderを使っても同じようにimport tkinterの部分でエラーが出ます。
Pythonのエラーの場合、
- 構文自体にエラーがある(打ち間違い)
- その行の処理に関連する物に問題がある
という考え方でコードを辿る事になる(どの言語も同じですが...。)のですが、tkinterやTurtleのエラーがimport部分で出ている場合、[ 文字列的に何をしようとしているのか解らない ] ような状態になっている [ 構文の間違い ] や [ 打ち間違い ] を最初に確認して、問題がないのにエラーが出る場合だと、
- モジュールそのものが存在しない
- 呼び出すべき物が存在しない
場合があります。ANACONDAやMINICONDAの場合だとcondaでパッケージをインストールすることになりますが、通常だとpipでパッケージの追加をすることになります。
プログラミング言語には、ECMA Scriptのように最初からブラウザに表示したものをコントロールするもの(ちなみに、この言語はそのままだとファイル保存ができません。)や.NETのように最初からライブラリを用意してコードを書くとウィジェットを使えるものもありますが、そうでないものだと、ウィジェットを使える環境を事前に揃えておく必要があります。
Tkinterの構造
tkをインストール後にimport tkinterでエラーが出なくなった場合、tknterは使用できるのですが、tkinterは最初にウインドウを作成してその中にフレームを配置する仕組みになっています。その為、
ウインドウ
┃
┗ フレーム
┃
┗ ウィジェット
のような階層構造になっています。
GUIプログラミングの最初の作業は、ウインドウの表示になりますが、tkinterの場合だと
import tkinter
#ウインドウの指定
root = tkinter.Tk()
#タイトルの指定
root.title(‘ Tkinterのテスト ’)
#ウインドウサイズ(x,y)の指定
root.geometory(‘800x600’)
#▼この部分にフレームの記述する
#ウインドウ表示のループ
root.mainloop
のような感じになります。これでウインドウに名前が表示された状態で表示されますが、この中にフレームを追加して状態をきえていくことになります。
基本的にこの中にフレームを配置することになりますが、コード内に同じ記述があるのと、引数は変数化できるので、変数を使って書き換えると
import tkinter as tk
r=root
s='800x600'
t='Tkinterのテスト'
r = tk.Tk()
r.title(t)
r.geometory(s)
#▼この部分にフレームの記述する
r.mainloop
のようなコードになります。この構造がウインドウという土台になるので、コンコードはテンプレート化しておいて、タイトルやサイズの部分だけ入れ替えれば何度でも使用できます。
このようにコードを書く際には [ 定型のフォーマット ] が存在するわけですがエディタの入力支援はこうした特徴を反映して追加できるような機能になっています。
当然、OSに付属するテキストエディタにはスニペットや自動でテンプレートを作ってくれるような機能はありませんから、そういった環境の場合、こうした構造のものをテキストファイルで管理して使えるようにしておくと2分割表示でテンプレートを差し込んで作業ができるので、コピー&ペーストでテンプレートの挿入をおこなうことができます。
こうした処理は、viだとコマンドだけでそれができそうな感じなので、構文のテンプレートを用意しておけば、テンプレ用のテキストから行の位置をして、そこから複数行選択をした後に、コード側のテキストに戻ってバッファの内容を貼り付けることができるので、ターミナルエミュレーターだけでもそう言ったコーディングの方法を用いることができます。
フレームの考え方
ウインドウを配置した後には、その中に配置するものを用意することになります。この際に縦に三分割した
メニュー
コンテンツ
フッター
ように構造で、分かれている場合、パーツを個別に管理する™渦かしいので、パーツ単位でグループ分けをして配置するほうが後からウィジェットを追加したり変更する場合でも管理がしやすくなります。この [ ウィジェットのグループ分け ] をする時に使用するのが フレーム になります。
フレームの記述は、tkinterの中のFrameクラスを使っているので、tkinterで呼び出している場合、自作モジュールと記述方法は同じですから、
モジュール名 . クラス名
になりますから、
tkinter . Tk()
同様に
tkinter . Frame()
を使用します。関数を使用する際には、変数の中に関数を代入することで戻り値を使えるようになっていますが、フレームを使う際にも同様の記述になるので、
変数名 = tkinter . Frame()
という形で宣言して使用することになります。この状態では、引数がありませんから、引数を代入する必要がありますが、Frameクラスの引数に代入するのは、
tkinter . Tk()
になりますが、これを書くのは大変ですから、最初の段階でフレームに関連する記述を行う際に変数名を指定して扱いやすくしておくことになります。そのため、
import tkinter
#ウインドウの指定
root = tkinter.Tk()
#タイトルの指定
root.title(‘ Tkinterのテスト ’)
#ウインドウサイズ(x,y)の指定
root.geometory(‘800x600’)
#▼この部分がフレームの記述
#フレーム1の指定
f1 = tkinter.Frame(
root,
)
#フレーム2の指定
f2 = tkinter.Frame(
root,
)
#ウインドウ表示のループ
root.mainloop
のようにすることで、フレームの配置をおこなうことができます。当然これも、
import tkinter as tk
r=root
s='800x600'
t='Tkinterのテスト'
r = tk.Tk()
r.title(t)
r.geometory(s)
f1 = tk.Frame(
r,
)
f2 = tk.Frame(
r
)
r.mainloop
のように記述することができますが、これも
変数名 = tkinter.Frame(
tkinter.tk()を指定した変数名,
)
と言う定型フォーマットがあるので、これも呼び出して使用できるようにしておけば入力の負荷を減らすことができます。
ウィジェットについて
これは、
tkinter . ウィジェット名()
で指定することになりますが、必ず同じウィジェット名でpackする必要があります。なので、
tkinter . ウィジェット名()
ウィジェット名 . pack()
が一つのまとまりになっています。ウィジェットには各パーツの使用を決めるプロパティがありますが、それを引数の中で指定することになりますが、それと同時にここでフレームの指定をします。これによって、 グループ分け ができるようになります。そのため、ウィジェットの引数には、
- フレーム : どのグループのものなのか?
- プロパティ : パーツの詳細情報
を指定することになります。packを使って一つのグループに配置をすると、縦方向に順番に並ぶのですが、レイアウトをするばあいだと、位置決めをして配置したい場合もあると思います。
この場合は、pack()ではなく、grid()をつかうことになります。