CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
こんにちは、吉政創成 菱沼です。
さて、今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。
前回、ようやくヒット&ブローゲームの中身が完成しました。
今回からは外側の部分、実際にゲームをするときの画面の作成を学んでいきます。
画面作りで使用するのはPythonの標準GUI ツールキットであるtkinterです。今回はtkinterとは何か、どういうことができるのかをまとめてみました。
まず、ゲームに限らず、どのようなシステムでも大切なのが見た目。使う相手がどういった人間であるか(ITリテラシーの高低や、男女とか)によってメニューの置き場所や色使いなどが変わるため、先に設計をしておくことは重要ですよね。
今回はあくまで学習用のゲームなのでそこまで凝った作りにはならないようですが、今後、もし自分が何かを作るときには意識したいことではあります。
さて、では具体的に、Pythonではどうやって画面をつくっていけばいいのでしょうか。
引用------
P.156
ウィンドウ、入力用のテキストボックス、ボタンなど、グラフィカルな画面で操作するための部品軍を集めたものを「GUIツールキット」と呼びます。
GUIツールキットにはいくつかありますが、Pythonには標準で「tkinter」(ティーケイ・インター)というGUIツールキットが付属しているので本書ではこれを利用します。
※ほかに有名なGUIツールキットとして「wxPython」があります。
※Macで「tkinter」を利用するには、あらかじめChapter2で説明した「tcl/Tk」をインストールしておく必要があります
----
ということで、「tkinter」を使い、最終的に下の図のような、左側には入力欄、右側には履歴(入力した値とそれに対するヒットとブローの数)を表示させるような画面にしていくようです。
さて、上のような画面を作るにはまずは画面のベースを作るところから始まります。
左側が画面のベースを作成し、表示させるためのコードを入力したもので、右側がそれを実行したものです。
tkinterを使うにはimportしてからとなります。importの行には[as tk]という記述がありますが、これは、「これ以降、tkinterのことをtkって呼ぶから!」という宣言です。こうすることで短縮して書くことができるようになります。
ちなみにimportする際、Python3では【tkinter】と書きますが、Python2を使っている方は【Tkinter】と頭文字が小文字と大文字で異なりますので注意が必要です。この学習コラムではPython3.8を使用していますので、【tkinter】でOKです。
引用----
P.158
>>> root = tk.Tk()
>>> root.mainloop()
この2行はtkinterでウィンドウを表示するときの決まり文句です。
(中略)つまりtkinterはウィンドウを作り、それを変数rootが指している状態です。
>>> root.やりたい操作()
従って上記の書式のように、root変数に対して「やりたい操作()」を記述するとそのウィンドウに命令を与えることができるというわけです。
------
ところで、ここで「やりたい操作」とされたmainloopは一体何者なのか…。
調べてみると、「ループ処理を行う」ものであり、そしてその中ではイベントの処理も行われるようです。また、このmainloopの処理はどのウィジェットからでも実行ができる事ということがわかりました。
tkinterの「イベント」とはそのアプリで発生した以下の項目を指すそうです。
・マウスの移動やクリック
・キーボード入力
・ウィジェットの作成、配置、設定変更
上記のようなイベントに対して関数を実行(イベントハンドラ)して処理しますが、このイベントの処理はmainloopの中で行われるといいます。
例えば、ヒット&ブローでは、数字を入力したら「入力欄に表示する」という処理をする、チェックボタンをマウスでクリックされたら「入力された値がランダムな数字に当てはまっているか確認する」という処理が発生する、などが行われますが、それがイベント処理にあたります。
また、mainloopで行われるものはイベントの処理だけでなく、「アプリの待機」「イベントの発生有無の確認」も含まれています。
アプリの待機とは、通常、物事に終わりがあるのと同じようにアプリにも終わりがありますが、今回のようなヒット&ブローや計算機などでは、人が何かのアクションを起こすまでの間、アプリを終了させず、画面をそのままの状態にして待機させる必要があります。(終了ボタンを押してないのにアプリが落ちたら困りますよね。)
mainloopの存在によって、終了ボタンが押されるまでループ処理を継続(待機)させることができる、のだそうです。ヒット&ブローのゲーム画面として作成する予定のものにあてはめるとこんな感じかなーということで理解しました。
ちなみに、ループ処理というとwhileが浮かびますが、仮にmainloopを使わず、whileで記述した場合、アプリを待機させることはできても、画面の表示ができない(し、表示されないからイベントも発生しない)ので、そもそもアプリが表示できないそうです。
上記は以下URLを参考にしました。より詳しく知りたい方はご参照ください。
【Python】tkinterのmainloopについて解説|だえうホームページ
ボタンや入力欄はもちろん、チェックボックスやラジオボタンなどが使用できます。
また、tkinterにはttkというtkのテーマ付きのものも使用できるようで見た目がちょっとリッチになるようです。
※ttkを使用したい場合、次のような記述が必要です。
>>> import tkinter as tk (通常のimport文)
>>> from tkinter import ttk (追記する行)
使用できるウィジェットはtkとttkで異なるようで、それぞれこうなります。
tkとttk両方にあるもの |
tkにしかないもの |
ttkにしかないもの |
・Button ・Checkbutton ・Entry ・Frame ・Label ・LabelFrame ・Menubutton ・PanedWindow ・RadioButton ・Scale ・Scrollbar ・Spinbox |
・Canvas ・Listbox ・Menu ・Message |
・Combobox ・Notebook ・Progressbar ・Separator ・SizeGrip ・Treeview ※bkなどが使用できないため、背景色や文字色を変えたい場合にはttk.style()を使用して指定する必要があります。 |
具体的にどんな風に変わるのか、よく使いそうなものだけで比較してみました。特別な書式(装飾)は付けていません。
※ちなみに実際に書いたものの一部はこんな感じ。長いので一部分だけです。
そしてこちらが、上図を実行して出てきた画面です。
ちなみに、canvasで描けるものは直線(折れ線)、楕円、円弧、短形、多角形、イメージ、ビットマップ、文字列で、指定できる書式は塗りつぶし、塗りつぶす時の者用になるビットマップ、枠線の色、枠の幅だそうです。
詳細は以下参考サイトをご参考にしてください。
【参考サイト】
・tkinter --- Tcl/Tk の Python インタフェース|Python公式
・【Python】Tkinterのcanvasを使ってみる|Qiita @nnahito
・Ttk Widget の基本|Python3 Programming お気楽 Python3/Tkinter 超入門
それでは今回はここで終了です。次回は今回の知識をもとに画面を作ってみます!
お付き合いいただきありがとうございました。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes