画面を表示させる

Windowsのパソコンは、見た目で直感的に操作できるGUI(Graphical User Interface)を重視しています。操作の煩雑さが少ないので、パソコンに詳しくない人も操作しやすいのが特徴です。
一方で、コマンドだけでパソコンを操作するものをCUI(Command User Interface)と言います。パソコンに詳しくなるほど、こちらの方が便利だと感じる方が多いようです。Linuxのパソコンはこちらがメインです。

今回はPythonが提供している標準モジュール Tkinter を使って、GUIを表示させてみます。
Tkinter以外にも様々なモジュール(wxやPyQtなど)が用意されています。Tkinterが一番扱いやすいと思っていますが、それ故に高度なことはしにくいようです。とはいえ、個人で作るレベルにはTkinterで十分でしょう。
いきなりですが、以下のサンプルスクリプトを見てください。

(1行目) Tkinterモジュールを Tk という名前に変更してインポートします。
(3行目) これで画面を表示させることができます。
(4行目) ここからは root の設定をしています。geometryは画面のサイズで横300、縦200にしました。
(5行目) 画面のサイズを変えることを許可するかどうか。0が許可しない、1が許可するになります。これも同じく横・縦の順。
(6行目) 画面上に表示する文字のデフォルトフォントを指定しておきます。FixedSysというフォントのサイズ13です。一部だけ文字のフォントを変更することももちろんできます。
(8行目) これが無いと起動しません。GUIはボタンなどが押されたらそれに対応する処理を行いますが、何もない時はただ待っている状態です。その「待ち状態になれ」というのがこのmainloopです。ここを書かないと待ち状態にならないので、スクリプトが流れて一瞬で終了してしまいます。

今回はこれだけ。次回、ボタンを配置できるようになったら一気に楽しくなります。


Pythonの記事一覧へは こちら から。

threading と multiprocessing

パソコンには cpu と呼ばれる計算装置が入っています。そのcpuにはコアが複数個入っています。4コアとか8コアという言葉は、この計算装置の数を表しています。
通常、何か処理をさせるプログラムを書いて実行させたとき、どれか空いている1つのコアを用いて計算します。そしてその計算をしている間は、そのコアは別の作業をすることができません。

ですが実際には、1つの処理を行いながら別の処理も 同時に 行う必要がある場合があります。その代表的なものがアクションゲーム。アクションのジャンルでは様々なキャラクターが1フレームごとに動く距離や位置を計算することで成り立っています。こういった並列処理をしなければ、キャラクターがたった1つしか動かないようなゲームとなってしまいます。

ということで今回はその並列処理の書き方を簡単に紹介します。例外処理が大変で、突き詰めればとても難しい内容となるので基本の基本だけ。


Pythonでは並列処理は threading と multiprocessing というモジュールが用意されています。
multiprocessing が複数コアを使うのに対して(マルチプロセス化)、threading は1コアの中を複数の領域に分けて使います(スレッド化)。


まずは threading の使い方を見てみます。

(9-10行目) 並列に処理させたい内容を t1 と t2 として定義します。処理内容は関数内。
(11-12行目) スレッドをデーモン化しています。プログラム内で処理しているスレッドが全てデーモンスレッドになった場合、そのプログラムをその瞬間に(デーモンスレッドが途中であっても)終了させるようになります。このプログラムではデーモンスレッドにする意味はありませんが、デーモン化する方法を知らないと、全てのスレッド処理が終わるまで待つしかなくなるので・・・。
(13-14行目) スレッドをスタートして、スレッドリストに加えています。これで複数(この場合は2つ)の計算を同時に行い、出力結果には t1 と t2 が混ざったものになります。


続いて multiprocessing の使い方を見ていきましょう。

(9-10行目) ここで呼ぶクラスが変わるだけで、後は同じ書き方でいけます。

実行中に空いている端末でプロセスを確認すると(topコマンドなど)、threading では1つの、multiprocessing では複数のコアを使っていることも確認できます。

両者の使いわけですが、1つ1つが簡単な処理の場合には threading で十分、計算が重くて大変な時は multiprocessing の方が1つのコアをフルタイムで使える分処理が早く終わると考えて良いと思います。ただし multiprocessing を使う場合、コアを使いすぎてパソコン全体に負荷をかけないように。


Pythonの記事一覧へは こちら から。

glob

glob は linuxコマンドの ls とよく似ています。ディレクトリに存在するファイルをリストに格納します。
ファイルの指定は ls で打つときと同様、絶対ディレクトリでも相対ディレクトリでも可能ですし、ワイルドカードも使えます。

os.system(" ls *txt ") としてもリストとしては扱えないので、glob の方が扱いやすいのです。


Pythonの記事一覧へは こちら から。

random

random は乱数を扱うことができるモジュールです。ゲームを作る時や何かシミュレーションさせようと思った時には必須です。
random モジュールはシード値固定ではないので、実行させる度に数が変わります。


① random.random()
乱数の基本の関数。0から1までの少数を1つ返します。


② random.uniform( f1 , f2 )
f1 から f2 までの少数を1つ返します。①の拡張版です。


③ random.int( n1 , n2 )
n1 から n2 までの整数を1つ返します。①の整数版です。


④ random.shuffle( list )
ここから3つはリストを扱う関数です。リストの要素の順番をシャッフルします。元のリストを保存しない破壊的メソッドですのでご注意ください。


⑤ random.choice( list )
リストの中から要素を1つ選んで返します。


⑥ random.sample( list , n )
リストの中から要素をn個選んで、リストにして返します。選ばれた要素は元の順番を保持しません。nがリストの要素よりも多い場合にはエラーを吐きます。


Pythonの記事一覧へは こちら から。

sys

sys というモジュールもとても重要です。よく使うのは2つだけです。


① sys.argv[ N ]
sys.argv は、実行時の引数を扱うことができる関数です。C言語など、Python以外でも "argv" というのが引数を意味します。
sys.argv は端末で実行させる時に打ち込んだ内容を、スペース区切りを1つの要素としてリストに入れています。
引数を扱えるようになると、スクリプト実行時に幅がぐっと広がります。次のサンプルで確認してください。

(1行目) sysモジュールを読み込みます。
(3行目) sys.argv[1] というのが最初の引数です(sys.argv[0]には実行ファイルそのものが入ります)。引数は文字列扱いされるので、int をつけて整数に変換しておきます。
(4-7行目) 1から sys.argv[1] までの整数の和を計算させています。

この例のように、実行時に変数の値を引数として入力させてやれば、毎回実行させる度にスクリプトの対応部分を書き換える必要がなくなるので、覚えておくべき技です。


② sys.exit()
スクリプトをその場で終了させます。例外が起きた瞬間に終わらせたい、といった場合に使えます。


Pythonの記事一覧へは こちら から。

os

Pythonの標準モジュールをいくつか見ていきます。「標準」というのは、Pythonに付属されているから誰でもすぐに使える、という意味です。
今回は os というモジュールを見てみましょう。

os はその名の通り、パソコンのOSを制御するようなモジュールです。


① os.system( "command" )
一番よく使うのは os.system でしょうか。
これは、Pythonから端末に命令を書き込むことができるようになります。

この例では、script.sh を端末に打ち込むのではなくPythonから実行しています。
多くの数字処理などをPythonで行って、途中一部の処理だけ端末にコマンドを打ち込みたいなあ、といった場合に使えるでしょう。


② os.getcwd()
これは現在いるディレクトリを絶対パスの文字列で返してくれます。
例えば、特定のディレクトリでしか走らせたくないスクリプトなどがある場合には、今いるディレクトリがその特定のディレクトリかどうか、ということを冒頭に書いておけば事故を防げますね。


③ os.path.exists( "file" )
ファイルが存在するかどうかを調べます。True または False が返ってきます。


④ os.chdir( "directory" )
別のディレクトリに移動したい場合には os.chdir を使います。実は os.system を使ってもディレクトリ移動はできません。こちらを使ってください。


⑤ os.rename( "file1" , "file2" )
ファイル名を変更したい場合にはこれを使ってください。file1 → file2 と名前が変わります。こちらは os.system を使っても書くことはできます。


Pythonの記事一覧へは こちら から。

重複要素を除く

sort / sortedreverse / reversed で、リストの要素の順番を並び替える方法を見てきました。
今度は、要素の重複を上手く除く方法を考えてみましょう。


まずは自力で書いてみます。
これまでの知識だけで書くならば、例えば次のよう。

この例では、Bという新しいリストを用意しておき、Aの要素がBに無ければBに加える、を繰り返しています。リストBには重複した要素が見事になくなっています。


でも実はPythonにはリストの重複した要素を除去してくれる set という便利なメソッドがあるので、使ってみましょう。
以下のサンプルを見てください。

set を使うとなんと1行で重複要素を除くことができました。
ただし、print された結果を見てください。1つ目の例と少し違いますね?実はsetを使うと元のリストの順番は保存されず、Python内で勝手にsortされてしまうのです。これが許せない場合にはこの書き方ではいけません。


set を使って1行で書ける便利な方法はないのか・・・?
あります!前々回学んだ sorted での key を指定する方法と組み合わせればいけます。

sorted の key に A.index を指定すると、ご覧の通り、元の要素の順番を保持していることが分かりますね。よく理解できなかったとしても、これをそのまま書けばそれ以上困ることは無いのでは、と思います。おすすめ。


Pythonの記事一覧へは こちら から。